接触到元类,怎么理解下面的元类相关代码⬇️
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()
,因为在类被创建的时候,属性名就已经被转换成小写了。