MST

星途 面试题库

面试题:Python元类在子类属性与方法定义中的高级应用

使用元类定义一个基类`MetaBase`,要求所有继承自`MetaBase`的子类在定义时,如果子类没有显式定义某个特定属性(如`specific_attr`),则自动为该子类添加该属性,并且属性值为子类的类名。同时,如果子类没有定义特定方法(如`specific_method`),则自动为子类添加一个方法,该方法返回子类所有属性组成的字典。请编写完整的Python代码实现上述功能,并解释元类在此过程中的作用和工作原理。
42.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
class MetaBase(type):
    def __new__(cls, name, bases, attrs):
        if'specific_attr' not in attrs:
            attrs['specific_attr'] = name
        if'specific_method' not in attrs:
            def specific_method(self):
                return self.__dict__
            attrs['specific_method'] = specific_method
        return super().__new__(cls, name, bases, attrs)


class SubClass(metaclass=MetaBase):
    pass


print(SubClass.specific_attr)
sub_obj = SubClass()
print(sub_obj.specific_method())

元类的作用和工作原理

  1. 作用:元类在Python中是类的类,用于控制类的创建过程。通过定义元类,可以在类创建时动态地修改类的属性和方法,实现一些高级的元编程功能。在本题中,元类MetaBase用于确保所有继承自MetaBase的子类在定义时,如果缺少特定属性和方法,会自动添加。
  2. 工作原理
    • __new__方法是元类中用于创建类对象的特殊方法。它接收四个参数:cls(元类自身)、name(要创建的类的名称)、bases(要创建的类的基类元组)和attrs(要创建的类的属性字典)。
    • __new__方法中,首先检查attrs字典中是否存在specific_attrspecific_method。如果不存在,则根据需求添加相应的属性和方法。
    • 最后,通过调用super().__new__(cls, name, bases, attrs)来创建并返回新的类对象。这样,在创建子类时,元类MetaBase就会按照设定的规则对其进行修改。