2016-02-08 44 views
3
class P(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 
class C(P): 
    def __init__(self, c): 
     P.__init__() 
     self.c = c 

obj = C(a, b, c) #want to instantiate a C with something like this 

我想定義C類對象無需重寫所有P類構造函數的參數在C的構造,但上面的代碼似乎並沒有工作。什麼是正確的方法來做到這一點?參數傳遞給父類的構造沒有childclass構造重複他們

澄清:

這樣做是爲了避免把父類的構造函數的參數在子類的構造函數。這只是重複太多。我所有的父母和孩子班級都對建設者有很多理由,所以一再重複這些建議並不是很有效率,也很難維護。我試圖看看我是否只能在其構造函數中定義子類的唯一性,但仍然初始化繼承的屬性。

+0

你要初始化父類的屬性或沒有?如果不是,他們可以避免調用它的構造函數 – AlokThakur

+0

我確實想要初始化父類的屬性。我認爲另一種方法是用父類的實例和子類的唯一參數構造子類。 – Fenwick

回答

4

在Python2調用父類的構造函數,你寫

class C(P): 
    def __init__(self, a, b, c): 
     super(C, self).__init__(a, b) 
     self.c = c 

,其中的第一個參數super是子類,第二個參數是您想要引用的對象實例作爲其父類的實例。

在Python 3,super有超級大國,你可以寫

class C(P): 
    def __init__(self, a, b, c): 
     super().__init__(a, b) 
     self.c = c 

演示:

obj = C(1, 2, 3) 
print(obj.a, obj.b, obj.c) # 1 2 3 

迴應您的評論:

你可以實現與* ARGS或效果** kwargs語法,例如:

class C(P): 
    def __init__(self, c, *args): 
     super(C, self).__init__(*args) 
     self.c = c 

obj = C(3, 1, 2) 
print(obj.a, obj.b, obj.c) # 1 2 3 

class C(P): 
    def __init__(self, c, **kwargs): 
     super(C, self).__init__(**kwargs) 
     self.c = c 

obj = C(3, a=1, b=2) 
print(obj.a, obj.b, obj.c) # 1 2 3 

obj = C(a=1, b=2, c=3) 
print(obj.a, obj.b, obj.c) # 1 2 3 
+0

感謝您的回答 - 我添加了澄清部分來更好地解釋我的問題。 – Fenwick

+0

@Fenwick更新回答 – timgeb

+0

@Fenwick但如果你的問題是如何用a和b初始化C,但是在調用初始化程序時沒有以某種形式爲a和b提供任何值,答案是你不能。 – timgeb

0

你可以通過自己和必需的參數

class C(P): 
    def __init__(self, a,b,c): 
     P.__init__(self,a,b) 
     self.c = c 
+0

謝謝,我明白你的意思。我只是在尋找更好的解決方案/語法。參見澄清部分。 – Fenwick

相關問題