我不知道super().__init__(*args, **kwargs)
在这里做什么
class B(type):
def __init__(self, *args, **kwargs):
self.a = 'a'
super().__init__(*args, **kwargs)
class A(metaclass=B):
pass
据我所知,super()返回跟踪MRO中当前位置的超类的实例。在超级实例上调用方法时,超级在MRO中查找下一个类并调用该类上的方法
B.__mro__
(<class '__main__.B'>, <class 'type'>, <class 'object'>)
super().__init__(*args, **kwargs)
调用<;类“类型”>;'s__init__
方法,它是什么意思
如果我删除它
class B(type):
def __init__(self, *args, **kwargs):
self.a = 'a'
class A(metaclass=B):
pass
初始化A
类
x=A()
x.a
'a'
属于A
类的实例x
仍然拥有属性a
,它具有相同的效果
这是一个简单的例子
这里
A
是我们的基类,我们希望它的任何子类都具有A的所有特性,再加上子类所具有的任何额外特性,然后添加新特性,我们只需将它子类化,并使用super将A
知道如何做的部分委托给我们的父类,我们不重复这些部分,这里B
是坚持这一原则的子类现在
Bad
是一个子类,它不遵循这个原则,因此不会有任何在A
父类的构造中设置的特性,因此它不会设置其.a
属性,因为它拒绝通过super调用其父构造函数来进行协作一些相关的解释视频: Raymond Hettinger - Super considered super! - PyCon 2015
相关问题 更多 >
编程相关推荐