Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python基类';隐式super()调用_Python_Python 3.x_Class_Inheritance - Fatal编程技术网

Python基类';隐式super()调用

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

目前,我开始修改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
定义初始化(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时,我明白了。谢谢