class?A(object):
????def?__init__(self,?a):
????????print?'__init__?A',?str(a)
????????self.A?=?a
class?B(A):
????def?__init__(self,?a,?b):
????????super(B,?self).__init__(a)
????????print?'__init__B',?str(b)
????????self.B?=?b
????????
class?C(A):
????def?__init__(self,?a,?c):
????????super(C,?self).__init__(a)
????????print?'__init__C',?str(c)
????????self.C?=?c
class?D(B,?C):
????def?__init__(self,?a,?b,?c):
????????super(D,?self).__init__(a,?b,?c)
????????print?'__init__D',?str(d)
????????self.D?=?d
shanghe?=?D('x',?'y',?'z',?'k')Traceback (most recent call last):? File "code", line 24, in <module>? ? shanghe = D('x', 'y', 'z', 'k')TypeError: __init__() takes exactly 4 arguments (5 given)請教這份代碼錯在哪里?
1 回答

清波
TA貢獻165條經驗 獲得超90個贊
首先用super超類初始化多重繼承時,容易引起多次繼承某些祖先類,比如說樓主代碼中的 class A。
其次利用super超類在進行初始化過程中 也遵循 MRO(Method Resolution Order),所以比較適合一些單線繼承,樓主的代碼其實有點Mixin (mix in)混入的意思,從多個祖先類繼承。這是就不能用super了,應該用:
ParentClassName.__init__(self,args)
另外,原則上不建議把繼承寫的太復雜。拙見,求各路大神拍磚指正
添加回答
舉報
0/150
提交
取消