我已经在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
只要理解这个问题,它就不会与另一个问题重复。
答案 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
想想你有三个课程,ClassA
,ClassB
,ClassC
和ClassC
延伸ClassA
和ClassB
(如果你是使用python2,ClassA
和ClassB
必须从object
延伸
class ClassC(ClassA, ClassB):
然后,ClassC.__mro__
将如下所示:
(<class '__main__.ClassC'>, <class '__main__.ClassA'>, <class '__main__.ClassB'>, <class 'object'>)
所以python继承了ClassC
,ClassA
,ClassB
顺序。并且它假定方法在此列表中具有相同的形式。这就是为什么您不能使用__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
但是,我仍然建议不要使用这种形式的继承,因为它非常复杂