python中多重继承的超级函数

时间:2017-11-09 05:40:07

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

我已经在python 3.4中编写了这段代码并使用了类。我已使用super()函数在此代码中实现了多重继承。我想调用库类的 init ()函数。但我无法,有人能告诉我这个错误吗?

class college:
    def __init__(self, rollno):
        print("Roll no:", rollno)

class library:
    def __init__(self, libcardno):
        print("Library card no:", libcardno)

class student(college, library):
    def __init__(self, name):
        print("Name:", name)
        super().__init__(5560)
        super().__init__(60)

输出

>>> obj = student("John")
Name: John
Roll no: 5560
Roll no: 60

只要理解这个问题,它就不会与另一个问题重复。

2 个答案:

答案 0 :(得分:1)

您可以直接调用相应父类的__init__方法。

class student(college, library):
    def __init__(self, name):
        print("Name:", name)
        college.__init__(self,5560)
        library.__init__(self,60)

答案 1 :(得分:1)

<强>短

您不能,也不需要使用super()以不同的格式致电__init__。当然有办法,但我不建议这样做。

<强>长:

Python使用要继承的类列表。您可以看到该列表 ClassName.__mro__mro代表Method Resolution Order

想想你有三个课程,ClassAClassBClassCClassC延伸ClassAClassB(如果你是使用python2,ClassAClassB必须从object延伸

class ClassC(ClassA, ClassB):

然后,ClassC.__mro__将如下所示:

(<class '__main__.ClassC'>, <class '__main__.ClassA'>, <class '__main__.ClassB'>, <class 'object'>)

所以python继承了ClassCClassAClassB顺序。并且它假定方法在此列表中具有相同的形式。这就是为什么您不能使用__init__使用不同形式的super()来电。

如果您需要使用super()并且没有选项,您可以考虑将参数传递为**kwargs

class ClassA():
    def __init__(self, **kwargs):
        super(ClassA, self).__init__(**kwargs)
        print("Class A Initialized:", kwargs['a'])

class ClassB():
    def __init__(self, **kwargs):
        # super(ClassA, self).__init__(**kwargs)
        # if you call above, you'll get type error, because above will call object.__init__ which takes only 1 argument
        print("Class B Initialized:", kwargs['b'])

class ClassC(ClassA, ClassB):
    def __init__(self, **kwargs):
        super(ClassC, self).__init__(**kwargs)
        print("Class C Initialized:", kwargs['c'])

ClassC(a="A", b="B", c="C")

你可以得到以下输出:

Class B Initialized: B
Class A Initialized: A
Class C Initialized: C

但是,我仍然建议不要使用这种形式的继承,因为它非常复杂