大家好,社区很棒, 作为我课程的一部分,我正在用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()
错误?在
如何从多个基类正确继承并使用主类中的变量和方法而不出现此错误?在
谢谢。在
基本上,Python正在查看父类(以及它们的父类等,请参阅本段末尾的链接)中的某个方法
__init__
。它从左到右读取类,以便首先看到Base1
。由于Base1.__init__
存在,因此调用该方法。阅读this answer上更详细的解释。在我相信调用所有适当方法的唯一方法是手动调用
那么
^{pr2}$印刷品
如果使用
super()
,则必须始终使用它来确保调用所有类的方法。您的Base1
和Base2
类也应该在它们的__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
调用。没必要,但不会疼的。在输出
^{pr2}$顺便说一句,你真的应该使用python3。^在现代Python中,{cd1>是更好的。:)
相关问题 更多 >
编程相关推荐