不知道Python元类示例代码中'return type.__new__(metacls, name, bases, namespace)'的含义和原因

问题描述 投票:0回答:1

我正在尝试了解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)
?是什么意思?

python metaclass
1个回答
0
投票

首先考虑一下定义类意味着什么:

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__
示例实际上并没有做任何常规课程无法完成的事情。

© www.soinside.com 2019 - 2024. All rights reserved.