为什么要调用元类的new

2024-04-30 01:21:04 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python元类A创建一个新类B。你知道吗

CB继承时,为什么调用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__  


Tags: 方法nametestnewreturndeftypepass
1条回答
网友
1楼 · 发布于 2024-04-30 01:21:04

类是元类的实例,默认元类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__允许元类对新的类主体、附加的基和名称空间以及关键字作出反应。你知道吗

相关问题 更多 >