这两个代码示例有什么区别?
1:
class SubType(type):
def __init__(cls, name, bases, dct):
super().__init__(name, bases, dct)
2:
class SubType(type):
def __init__(cls, name, bases, dct):
pass
这两个代码示例有什么区别?
1:
class SubType(type):
def __init__(cls, name, bases, dct):
super().__init__(name, bases, dct)
2:
class SubType(type):
def __init__(cls, name, bases, dct):
pass
在一种情况下,您正在为所有类(即类型)调用__init__
基类的方法 - 而在另一种情况下,您不是。
由于默认情况下此方法不执行任何操作,因此两个列表之间实际上没有区别。
(真正执行类创建魔法的是元类__new__
方法——如果不调用本机基础元类方法,就不可能在 Python 中拥有新对象__new__
。
在 python 3.x 中,这意味着调用超类(即类型)的 __init__ 方法(就好像它是当前类 SubType 的方法,因为当前类是超类的派生类)。
与 Python 2.x 中调用 super(type, self).__init__() 相同
例如:
class type:
def __init__(self, a):
print(a)
class SubType(type):
def __init__(self, a):
super().__init__(a)
>> obj = SubType(2)
2
>>
Super 让您避免显式引用基类,这很好。但主要优势在于多重继承,可以发生各种有趣的事情。如果您还没有,请参阅super 上的标准文档。
块 1 中的代码将在 Python 2 中中断,但将在 Python 3 中通过。块 2 中的代码将同时通过。