我想知道我用Python得到的这个问题,我确信这是众所周知的。我现在已经习惯了Python一段时间了,我已经习惯了它的味道但是我遇到了下面概述的这个问题。如果您运行以下代码:
import pprint
pp = pprint.PrettyPrinter(indent=4).pprint
class Foo(object):
def __init__(self):
self.foo_var = 1
class Bar(Foo):
def __init__(self):
self.bar_var = 2
super(Foo, self).__init__()
def deep_access(self):
pp(self.bar_var)
class FooBar(Bar):
def __init__(self):
self.foobar_var = 3
super(Bar, self).__init__()
def access(self):
# call Bar
self.deep_access()
fb = FooBar()
fb.access()
您将收到以下错误:
Traceback (most recent call last):
File "inheritance.py", line 29, in <module>
fb.access()
File "inheritance.py", line 26, in access
self.deep_access()
File "inheritance.py", line 16, in deep_access
pp(self.bar_var)
AttributeError: 'FooBar' object has no attribute 'bar_var'
从错误中我收集它在FooBar而不是Bar中寻找bar_var,但是如果我调用父类,为什么不使用在父类中声明的变量?如何让父类访问它自己的变量?对我来说,对OOP采用不同的方法似乎很奇怪。
而不是self.deep_access
它尝试了Bar.deep_access(self)
和super(FooBar, self).deep_access
以及super(Bar, self).deep_access
,但它不起作用。
答案 0 :(得分:2)
您没有正确调用super()
。第一个参数应该始终是调用 super的类,而不是它的任何基类..
变化
class Bar(Foo):
def __init__(self):
self.bar_var = 2
super(Foo, self).__init__()
# ^^^
到
class Bar(Foo):
def __init__(self):
self.bar_var = 2
super(Bar, self).__init__()
# ^^^
依旧......
有一篇很好的文章解释了super()
名为"Super considered Super!"的大部分细节