接触到元类,怎么理解下面的元类相关代码⬇️
class LowercaseMeta(type):
def __new__(mcs, name, bases, attrs):
lower_attrs = {}
for k, v in attrs.items():
if not k.startswith('__'):
lower_attrs[k.lower()] = v
else:
lower_attrs[k] = v
return type.__new__(mcs, name, bases, lower_attrs)
class LowercaseClass(metaclass=LowercaseMeta):
BAR = True
def HELLO(self):
print("hello")
print(dir(LowercaseClass))
LowercaseClass().hello()
当 python 看到 class LowercaseClass(metaclass=LowercaseMeta): 时,它并不是简单的把__new__方法放到LowercaseClass中,而是:
-
python 发现要创建
LowercaseClass这个类, -
看到
metaclass=LowercaseMeta,意味着:"嘿,创建这个类的时候不要使用默认的type,要用LowercaseMeta来创建", -
于是 python 调用
LowercaseMeta,并传入:a.LowercaseClass的名字(name); b. 继承的基类(bases); c. 累的属性字典(attrs,包含BAR,HELLO), -
LowercaseMeta.__new__处理这些属性,把它们变成小写, -
最后用处理后的属性创建并返回真正的
LowercaseClass,
这就是为什么我们能用 LowercaseClass().hello() 而不是 LowercaseClass().HELLO() ,因为在类被创建的时候,属性名就已经被转换成小写了。