繁体   English   中英

Python多重继承不显示类变量或第二个继承基类的方法

[英]Python multiple inheritance is not showing class variables or method of second inherited base class

您好,社区,我正在学习OOPS概念与python作为我的课程的一部分。 我在python中遇到多重继承问题。 以下是我的代码:

#!/usr/bin/env python

class Base1(object):
    def __init__(self):
        self.base1var = "this is base1"


class Base2(object):
    def __init__(self):
        self.base2var = "this is base2"

class MainClass(Base1, Base2):
    def __init__(self):
        super(MainClass, self).__init__()


if __name__ == "__main__":
    a = MainClass()
    print a.base1var
    print a.base2var

并且在运行时,我收到以下错误

print a.base2var
AttributeError: 'MainClass' object has no attribute 'base2var'

如果我交换继承的类的顺序,则错误中的变量名会相应地更改。

当我想调用两个继承类的构造函数时,我是否使用了super()错误?

如何才能正确地从多个基类继承并使用主类中的变量和方法而不会出现此错误?

谢谢。

你需要向Base1添加一个super调用,以便在Base1之后调用Base2的__init__ 您还可以向Base2添加super呼叫。 这没有必要,但不会受到伤害。

class Base1(object):
    def __init__(self):
        super(Base1, self).__init__()
        self.base1var = "this is base1"

class Base2(object):
    def __init__(self):
        #super(Base2, self).__init__()
        self.base2var = "this is base2"

class MainClass(Base1, Base2):
    def __init__(self):
        super(MainClass, self).__init__()


if __name__ == "__main__":
    a = MainClass()
    print a.base1var
    print a.base2var

产量

this is base1
this is base2

顺便说一下,你真的应该使用Python 3.在现代Python中, super更好。 :)

如果使用super() ,则必须始终如一地使用它以确保调用所有类的方法。 你的Base1Base2类也应该在它们的__init__()方法中调用super(...).__init__() 这将确保最终调用方法解析顺序中的所有类。

当并非所有__init__()方法都有一个空参数列表时,这确实有点棘手。 在某些时候, super()会让你调用object.__init__() ,并且永远不会接受任何参数。 麻烦的是,您可能不知道这可能会提前发生在哪个类中。 您可以通过创建一个object子类来解决这个问题,该子类在__init__()中接受任意数量的参数,并从中派生出来。 该类不需要调用object.__init__()因为该方法实际上并没有做任何事情(或者,如果你可能会改变偏执,你可以在不使用super()情况下调用object.__init__() super() )。

通常, super()在参数处理中需要格外小心,因为您可能不知道方法解析顺序中的下一个类,因为代码的用户可能会使用您未预期的组合使用基类创建新类。 因此,您需要做一些工作以确保所有类中的方法签名兼容。

有关更多信息,请参阅Raymond Hettinger的开创性Python的Super()Considered Super

基本上发生的事情是Python正在查看父类(及其父母等,请参阅本段末尾的链接)以获取某些方法__init__ 它从左到右读取类,因此它首先看到Base1 由于Base1.__init__存在,因此调用该方法。 这个答案中阅读更详细的解释。

我认为调用所有适当方法的唯一方法是手动完成

class MainClass(Base1, Base2):
    def __init__(self):
        Base1.__init__(self)
        Base2.__init__(self)

然后

a = MainClass()
print(a.base1var)
print(a.base2var)

版画

this is base1
this is base2

Base1 __init__会覆盖Base2 __init__.py因此永远不会创建base2var

你应该使用super ,看看Python的super()如何与多重继承一起工作?

使用超级而不是用于那个目标并不是错误。解释超级我已经改变了你的代码

#!/usr/bin/env python

class Base1(object):
    def __init__(self):
        self.base1var = "this is base1"


class Base2(object):
    def __init__(self):
        self.base2var = "this is base2"

class MainClass(Base2, Base1):
    def __init__(self):
        super(MainClass, self).__init__()


if __name__ == "__main__":
    a = MainClass()
    print (a.base2var)

比你有

this is base2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM