2

您好,我正在搜索 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,并且比单继承语言中的超级调用更强大。

在需要手动初始化的情况下如何更强大?很抱歉所有这些问题。提前致谢。

4

5 回答 5

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
于 2012-10-05T20:06:08.420 回答
4

没有调用基类方法,因为您没有调用它们。无论是单个碱基还是多个碱基,您都必须明确地执行此操作。在这个简单的例子中,添加super().__init__()所有三个类。有关更一般的建议,请阅读Python 的 super() 被认为是超级!.

于 2012-10-05T20:08:44.600 回答
2

在您的示例中,您专门用子类init方法覆盖了继承的init方法。如果您希望所有这些都运行,您可以使用 super() 显式调用父级的 init 方法。

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

于 2012-10-05T20:07:12.680 回答
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(),要么都不调用。

于 2012-10-05T21:00:53.570 回答
0

正确的例子是 som,thing along (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 定义了“超级”内置函数,它使用描述良好的方法解析顺序正确解析下一个被调用的方法——因此,它根本不是“问题”——相反,它工作得很好在极端情况下,其他语言确实有问题 - 此处描述:http: //www.python.org/download/releases/2.3/mro/

于 2012-10-05T20:14:53.307 回答