MST

星途 面试题库

面试题:Python类属性默认值的元类控制

使用元类来控制类属性默认值的设定。定义一个元类`DefaultMeta`,当使用该元类创建类时,如果类属性没有显式赋值,元类会根据特定规则(例如属性名以`default_`开头的,为其设定默认值为属性名去掉`default_`后的字符串)来设定默认值。请编写完整的元类及使用该元类创建类的示例代码,并解释元类在这种场景下的工作原理。
24.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
class DefaultMeta(type):
    def __new__(mcs, name, bases, attrs):
        new_attrs = {}
        for key, value in attrs.items():
            if not hasattr(value, '__call__') and key.startswith('default_'):
                new_attrs[key.replace('default_', '')] = key.replace('default_', '')
            else:
                new_attrs[key] = value
        return super().__new__(mcs, name, bases, new_attrs)


class MyClass(metaclass=DefaultMeta):
    default_name = None
    age = 20


obj = MyClass()
print(obj.name)  
print(obj.age)  

元类工作原理解释

  1. __new__ 方法:元类的 __new__ 方法负责创建类对象。在这个方法中,遍历类属性字典 attrs
  2. 属性检查:对于每个属性,检查其是否可调用(即不是方法)并且属性名是否以 default_ 开头。
  3. 设定默认值:如果属性符合条件,将属性名去掉 default_ 前缀后的字符串作为默认值,重新添加到新的属性字典 new_attrs 中。不符合条件的属性则直接添加到 new_attrs
  4. 创建类对象:最后通过 super().__new__ 创建新的类对象,并返回这个类对象,完成类的创建,这样类的属性就按照特定规则设定了默认值。