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