我正在尝试了解Python元类。我几乎明白了Python中Metaclass的作用,但我无法理解示例代码的含义
class MakeCalc(type):
def __new__(metacls, name, bases, namespace):
namespace['desc'] = 'calculation'
namespace['add'] = lambda self, a, b: a + b
return type.__new__(metacls, name, bases, namespace)
为什么这个元类返回
type.__new__(metacls, name, bases, namespace)
?是什么意思?
首先考虑一下定义类意味着什么:
class Simple:
pass
class NotAsSimple(Simple):
pass
我们声明
Simple
有一个基类(在本例中只是 object
)。它有一个名字。它还会有一个 dict
用于存储它的属性,称为命名空间。 NotAsSimple
有一个额外的基类。 Python 本质上将上面的这些行转换为参数,传递给 type
,后者调用 type.__new__
。它在那里被组合成一个返回的“新”对象,在本例中是一个类。这些是创建类的默认步骤的一部分。所有类都可以被视为构建“事物”的指导手册。元类只是构建指导手册的指导手册的一个奇特名称。更改元类是说,使用我的说明手册来构建此说明手册(如果您想要的话,您可以使其不返回新的说明手册)。
class UsesMeta(metaclass=MakeCalc):
pass
当
MakeCalc
用作元类时,使用 MakeCalc.__new__
。一旦它添加到命名空间,就会像以前一样定期调用 type.__new__
来完成需要完成的工作。
顺便说一句,提供的
MakeCalc.__new__
示例实际上并没有做任何常规课程无法完成的事情。