Python中的多重继承是否有问题?

时间:2012-10-05 20:01:56

标签: python python-3.x multiple-inheritance

你好我在python中搜索类继承,我发现它也支持多重继承,但不知何故似乎有问题:o 我找到了一个例子:

class ParentOne:
    def __init__(self):
        print "Parent One says: Hello my child!"
        self.i = 1

    def methodOne(self):
        print self.i

class ParentTwo:
    def __init__(self):
        print "Parent Two says: Hello my child"

class Child(ParentOne, ParentTwo):
    def __init__(self):
        print "Child Says: hello"
A=Child()

输出

Child Says: hello

因此,当子继承ParentOne和ParentTwo时,为什么不初始化这些类?我们应该在继承类Child中手动初始化它们吗? 什么是正确的示例,以便我们可以看到仅使用继承打印的所有消息?

  

事实上,它稍微复杂一些;方法解决方案   动态更改订单以支持对super()的协作调用。   这种方法在一些其他多继承语言中是已知的   作为call-next-method,比在中发现的超级调用更强大   单继承语言。

当需要手动初始化时,如何才能更强大? 对不起,所有这些问题。 提前谢谢。

5 个答案:

答案 0 :(得分:7)

这是super的用途:

class ParentOne():
    def __init__(self):
        super().__init__()        
        print("Parent One says: Hello my child!")
        self.i = 1

    def methodOne(self):
        print(self.i)

class ParentTwo():
    def __init__(self):
        super().__init__() 
        print("Parent Two says: Hello my child")

class Child(ParentOne, ParentTwo):
    def __init__(self):
        super().__init__()
        print("Child Says: hello")

A=Child()

打印

Parent Two says: Hello my child
Parent One says: Hello my child!
Child Says: hello

答案 1 :(得分:4)

不调用基类方法,因为您没有调用它们。无论是否存在单个碱基或多个碱基,您始终必须明确地执行此操作。在这个简单的情况下,将super().__init__()添加到所有三个类。有关更一般的建议,请阅读Python’s super() considered super!

答案 2 :(得分:2)

在您的示例中,您将使用子类 init 方法专门覆盖继承的 init 方法。如果要运行所有这些,可以使用super()。

显式调用父类的init方法

如果您没有覆盖 init 方法,那么此示例中将使用ParentOne中的方法。

答案 3 :(得分:2)

这很简单:

class ParentOne:
    def __init__(self):
        print "Parent One says: Hello my child!"
        self.i = 1

    def methodOne(self):
        print self.i

class ParentTwo:
    def __init__(self):
        print "Parent Two says: Hello my child"

class Child(ParentOne, ParentTwo):
    def __init__(self):
        ParentOne.__init__(self)
        ParentTwo.__init__(self)
        print "Child Says: hello"

A=Child()

问题解决了。您也可以使用super()但在这种情况下您不需要。请注意,您不能混合使用这两种方法,您需要在所有层次结构中调用super(),或者 none

答案 4 :(得分:0)

正确的例子是som,ething(Python3):

class BaseClass:
    def __init__(self):
        print("Initializing base")

class ParentOne(BaseClass):
    def __init__(self):
        super().__init__()
        print("Initializing parent 1")

class ParentTwo(BaseClass):
    def __init__(self):
        super().__init__()
        print("Initializing parent 1")

class Child(ParentOne, ParentTwo):
    def __init__(self):
        super().__init__()
        print("Initializing child")

c = Child()

Python定义了" super"使用描述良好的方法解析顺序正确解析下一个要调用的方法的内置函数 - 因此,它不是" prtoblematic"完全相反, - 相反,它在其他语言确实存在问题的角落情况下运作良好 - 这里描述:http://www.python.org/download/releases/2.3/mro/