gpt4 book ai didi

python - 为什么调用元类的 __new__

转载 作者:行者123 更新时间:2023-12-01 00:58:26 28 4
gpt4 key购买 nike

使用Python元类A创建一个新类B

C继承B时,为什么调用A__new__方法?

class A(type):
def __new__(cls, name, bases, attrs):
print(" call A.__new__ ")
return type.__new__(cls, name, bases, attrs)


B = A("B", (), {})


class C(B):
pass
python test.py 
call A.__new__
call A.__new__

最佳答案

类是元类的实例,默认元类 type源自object 。因此,元类遵循创建object实例的常规规则。 -__new__构造实例,__init__可以初始化它。

>>> class DemoClass(object):
... def __new__(cls):
... print('__new__ object of DemoClass')
... return super().__new__(cls)
...
... def __init__(self):
... print('__init__ object of DemoClass')
... return super().__init__()
...
>>> demo_instance = DemoClass() # instantiate DemoClass
__new__ object of DemoClass
__init__ object of DemoClass

当我们的类是元类时,也会发生同样的情况 - 它仍然是 object并表现出这样的行为。

>>> class DemoType(type):
... def __new__(mcs, name, bases, attrs):
... print('__new__ object %r of DemoType' % name)
... return super().__new__(mcs, name, bases, attrs)
...
... def __init__(self, name, bases, attrs):
... print('__init__ object %r of DemoType' % name)
... return super().__init__(name, bases, attrs)
...
>>> demo_class = DemoType('demo_class', (), {}) # instantiate DemoType
__new__ object 'demo_class' of DemoType
__init__ object 'demo_class' of DemoType

重申一下,如果 aA 的一个实例,然后A.__new__用于创建a 。这同样适用于类和元类,因为前者是后者的实例。

类不继承__new__来自它的元类。一个类一个元类,并且该元类'__new__用于创建类。

<小时/>

当从类(元类的实例)继承时,元类也会被继承。这意味着子类也是元类的实例。因此,__new____init__元类的成员用于构造和初始化此实例。

>>> class DemoClass(metaclass=DemoType):
... ...
...
>>> class DemoSubClass(DemoClass):
... ...
...
__new__ object 'DemoClass' of DemoType
__init__ object 'DemoClass' of DemoType
__new__ object 'DemoSubClass' of DemoType
__init__ object 'DemoSubClass' of DemoType
>>> type(DemoClass) # classes are instances of their metaclass
__main__.DemoType
>>> type(DemoSubClass) # subclasses inherit metaclasses from base classes
__main__.DemoType

这样做的目的是元类存在于 define how classes are created 。这包括子类。调用__new__每个子类都允许元类对新的类体、附加基类和命名空间以及关键字使用react。

关于python - 为什么调用元类的 __new__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56038693/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com