Python v2.7.10的多重继承和变量访问问题

时间:2015-09-03 21:16:27

标签: python python-2.7 inheritance multiple-inheritance

我想知道我用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,但它不起作用。

1 个答案:

答案 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!"的大部分细节