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

2024-09-30 10:41:56 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,社区很棒, 作为我课程的一部分,我正在用python学习OOPS概念。我在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

当运行时,我得到以下错误

^{pr2}$

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

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

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

谢谢。在


Tags: selfobjectinitisdef错误thisclass
3条回答

基本上,Python正在查看父类(以及它们的父类等,请参阅本段末尾的链接)中的某个方法__init__。它从左到右读取类,以便首先看到Base1。由于Base1.__init__存在,因此调用该方法。阅读this answer上更详细的解释。在

我相信调用所有适当方法的唯一方法是手动调用

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

那么

^{pr2}$

印刷品

this is base1
this is base2

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

当并非所有__init__()方法都有空参数列表时,这确实有点棘手。在某个时刻,super()会让您调用object.__init__(),而且它从不接受任何参数。问题是,您可能不知道在哪些类中可能会发生这种情况。您可以通过创建一个object子类来解决这个问题,该子类接受__init__()中任意数量的参数,并从中派生。该类不需要调用object.__init__(),因为该方法实际上不执行任何操作(或者,如果您怀疑这可能会发生更改,则可以在不使用super()的情况下调用object.__init__())。在

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

有关更多信息,请参阅雷蒙德·海丁格的开创性著作Python's Super() Considered Super。在

您需要向Base1添加一个super调用,这样Base2的__init__将在Base1之后被调用。您还可以向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

输出

^{pr2}$

顺便说一句,你真的应该使用python3。^在现代Python中,{cd1>是更好的。:)

相关问题 更多 >

    热门问题