super()。\uuuuu init\uuuuuz(*args,**kwargs)做什么?

2024-09-22 20:21:00 发布

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

我不知道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,它具有相同的效果


Tags: 实例方法selfinitmaindeftypeargs
1条回答
网友
1楼 · 发布于 2024-09-22 20:21:00

这是一个简单的例子

>>> class A:
        def __init__(self, a="a",*argv,**karg):
            super().__init__(*argv,**karg)
            self.a=a

    
>>> class B(A):
        def __init__(self, b="b",*argv,**kargv):
            super().__init__(*argv,**kargv)
            self.b=b

        
>>> class Bad(B):
        def __init__(self,b="bad",*arg,**kargv):
            self.b=b

        
>>> b=B()
>>> b.a
'a'
>>> b.b
'b'
>>> bad=Bad()
>>> bad.b
'bad'
>>> bad.a
Traceback (most recent call last):
  File "<pyshell#220>", line 1, in <module>
    bad.a
AttributeError: 'Bad' object has no attribute 'a'
>>> 

这里A是我们的基类,我们希望它的任何子类都具有A的所有特性,再加上子类所具有的任何额外特性,然后添加新特性,我们只需将它子类化,并使用super将A知道如何做的部分委托给我们的父类,我们不重复这些部分,这里B是坚持这一原则的子类

现在Bad是一个子类,它不遵循这个原则,因此不会有任何在A父类的构造中设置的特性,因此它不会设置其.a属性,因为它拒绝通过super调用其父构造函数来进行协作

一些相关的解释视频: Raymond Hettinger - Super considered super! - PyCon 2015

相关问题 更多 >