作者walelile (wakaka)
看板Python
標題[問題] class繼承 & __init__
時間Sun Oct 25 20:48:07 2015
不好意思,這個問題我不會直接描述,要請大家看一段sample code
--
from collections import UserList
# Python 3.5's source code:
# class UserList(MutableSequence):
# def __init__(self, initlist):
# ...
# (no super().__init__() here)
# 這是一個重要的parent class
class A(object):
def __init__(self, data, name, **kwargs):
super().__init__(data, **kwargs)
self.name = name
# class B的__init__執行的時候不會有問題,因為super().__init__會用
# UserList.__init__(...)
class B(A, UserList):
def __init__(self, data, name, path, **kwargs):
super().__init__(data, name, **kwargs)
self.path = path
# 這裡的__init__執行時候會出現error:
# object.__init__() takes no arguments
# 因為我在class A的__init__()中有呼叫super().__init__(data, **kwargs)
# 而其會對應到object.__init__() --> 不需要參數
class C(A):
def __init__(self, data, name, **kwargs):
super().__init__(data, name, **kwargs)
問題:
要如何解決class A __init__碰到的這種狀況?
我目前的想法是用try ... except 去嘗試兩種不同的super().__init__(...)
有比較推薦的解法嗎? 謝謝
※ 編輯: walelile (1.171.183.206), 10/25/2015 20:49:50
→ tiefblau: 就把A的super裡的data拿掉啊? 還是我誤會了什麼 10/25 21:52
→ AndCycle: 多重繼承的 super 要指定 init 誰, 去看官方文件 10/26 00:45
→ AndCycle: 而且你傳入值都會變就自己處理吧, 介面的問題要自己來 10/26 00:46
→ carlcarl: 不太懂 同一樓 10/26 01:08
因為A會跟UserList, UserDict等collections作搭配,而其__init__唯一的參數名不同,
所以我沒辦法直接用**kwargs,因此我用"data"當作pos arg,並傳給collections。
把A __init__()中的data換成*args看起可以正常跑。
謝謝大家的指點
※ 編輯: walelile (1.171.183.206), 10/26/2015 05:22:07