Python基类';隐式super()调用
目前,我开始修改python的OOP知识。我偶然发现了Python基类';隐式super()调用,python,python-3.x,class,inheritance,Python,Python 3.x,Class,Inheritance,目前,我开始修改python的OOP知识。我偶然发现了super()definition,这表明它为派生类提供了一组来自基类的实例变量和方法 我有一段代码: foo类: 巴=5 定义初始化(self,a): self.x=a def垃圾邮件(自我): 打印(self.x) baz类(foo): 通过 b=baz(5) b、 垃圾邮件() 执行时没有super()调用,没有错误,并且打印出5 现在,当我向派生类添加\uuuu init\uuu方法时,如下所示: foo类: 巴=5 定义初始化(s
super()
definition,这表明它为派生类提供了一组来自基类的实例变量和方法
我有一段代码:
foo类:
巴=5
定义初始化(self,a):
self.x=a
def垃圾邮件(自我):
打印(self.x)
baz类(foo):
通过
b=baz(5)
b、 垃圾邮件()
执行时没有super()
调用,没有错误,并且打印出5
现在,当我向派生类添加\uuuu init\uuu
方法时,如下所示:
foo类:
巴=5
定义初始化(self,a):
self.x=a
def垃圾邮件(自我):
打印(self.x)
baz类(foo):
定义初始化(self,a):
self.b=a
b=baz(5)
b、 垃圾邮件()
脚本给了我一个错误:AttributeError:'baz'对象没有属性“x”
因此,这表明,如果我的类有一个默认的
\uuu init\uuu
,那么它也有一个显式的super()
调用。我实际上找不到任何证实这一点的信息,所以我只是想问一下我是否正确。问题是,当你在你的子类baz
中定义方法\uuu init\uu
时,你不再使用父类foo
中的方法。然后,当您调用b.spam()
时,x
不存在,因为它是在父类的\uuuuuu init\uuuuu
方法中定义的
如果您希望调用父类的\uuuuu init\uuuu
方法并添加自己的逻辑,则可以使用以下方法解决此问题:
baz类(foo):
定义初始化(self,a):
super()。uuu init_uuu(10)#您可以传递任何要分配给x的值
self.b=a
>>>b=baz(5)
>>>b.垃圾邮件()
10
我不明白你在问什么。如果不定义方法,Python会从最近的祖先那里找到定义——这就是继承的全部意义。如果你真的定义了它,那就由你自己来调用super了。所以当我有一个空的派生类时-调用的是基类\uuuu init\uuuuuu
,而不是带有super()
调用的“生成的”派生类\uuu init\uuuuuu
,这有帮助吗?据我所知,它没有提到空的派生类,我只是好奇它是如何实现的——它是隐式地调用基类\uuuu init\uuuu
还是创建自己的\uuuu init\uuu
然后调用super()
你缺少了方法解析顺序的概念。如果调用了一个未定义的方法,Python将通过MRO进行处理,直到找到定义为止。没有代码生成。是的,现在当我读到Python中的MRO时,我明白了。谢谢