[Python开发笔记]怎么理解元类?

3 阅读1分钟

接触到元类,怎么理解下面的元类相关代码⬇️

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中,而是:

  1. python 发现要创建LowercaseClass这个类,

  2. 看到metaclass=LowercaseMeta,意味着:"嘿,创建这个类的时候不要使用默认的type,要用LowercaseMeta来创建",

  3. 于是 python 调用LowercaseMeta,并传入:a. LowercaseClass的名字(name); b. 继承的基类(bases); c. 累的属性字典(attrs,包含BAR, HELLO),

  4. LowercaseMeta.__new__处理这些属性,把它们变成小写,

  5. 最后用处理后的属性创建并返回真正的LowercaseClass

这就是为什么我们能用 LowercaseClass().hello() 而不是 LowercaseClass().HELLO() ,因为在类被创建的时候,属性名就已经被转换成小写了。