2017-03-02 91 views
1

很抱歉,如果我不解釋它是很好,但我會盡我所能:Python的繼承父類變量

所以我想繼承父類中的變量,但我不希望在創建Child類的實例時再次傳遞它們,因爲我認爲這是多餘的。例如,我只想使用Parent的眼睛顏色。請參見下面的示例代碼我的意思

這是什麼在起作用:

class Parent: 
    def __init__(self, eye_color, length): 
     self.eye_color = str(eye_color) 
     self.length = length 


class Child(Parent): 
    def __init__(self, gender, eye_color, length): 
     super().__init__(eye_color, length) 
     self.gender = str(gender) 

x = Parent("Blue", 2) 
y = Child("Men", "Blue", 2) 

print(x.eye_color, x.length) 
print(y.gender, x.length) 

這是我莫名其妙地想:

class Parent: 
    def __init__(self, eye_color, length): 
     self.eye_color = str(eye_color) 
     self.length = length 


class Child(Parent): 
    def __init__(self, gender): 
     super().__init__(eye_color, length) 
     self.gender = str(gender) 

x = Parent("Blue", 2) 
y = Child("Men") 

print(x.length, x.eye_color) 
print(y.gender, x.length) 
+0

你不能得到你想要的東西。但是你可以使用'*參數,** kwargs'幾乎到達那裏。 – wim

+2

'eye_color'和'length'特定於'Parent'的*實例*,而不是整個類。鑑於'x1 =父(「藍」,2)','x2 =父(「綠」,3)「和」y =子(「男」)','y.eye_color'或'y.length'是?至少,「Child.__ init__」需要將「Parent」實例作爲參數。 – chepner

+0

您可以在'Parent'類中創建'create_child'方法,該方法將返回具有父特徵的'Child'類的實例。所以你可以像'y = x.create_child()'使用它' –

回答

1

你可以嘗試通過一個Parent實例的Child初始化...這可能是最接近你會得到的。

class Parent: 
    def __init__(self, eye_color, length): 
     self.eye_color = str(eye_color) 
     self.length = length 


class Child(Parent): 
    def __init__(self, gender, parent): 
     super().__init__(parent.eye_color, parent.length) 
     self.gender = str(gender) 

x = Parent("Blue", 2) 
y = Child("Men", x) 

print(x.length, x.eye_color) 
print(y.gender, x.length) 

你可以做的另一件事是持有last_parent變量:

global last_parent 

class Parent: 
     def __init__(self, eye_color, length): 
      self.eye_color = str(eye_color) 
      self.length = length 
      last_parent = self 


class Child(Parent): 
    def __init__(self, gender): 
     super().__init__(last_parent.eye_color, last_parent.length) 
     self.gender = str(gender) 

x = Parent("Blue", 2) 
y = Child("Men") 

print(x.length, x.eye_color) 
print(y.gender, x.length) 
+0

謝謝你的解決方案是非常有幫助的!我想我會採用這種方法。 – stickfigure4

1

你問什麼沒有意義:

class Parent: 
    def __init__(self, eye_color, length): 
     self.eye_color = str(eye_color) 
     self.length = length 


class Child(Parent): 
    def __init__(self, gender): 
     super().__init__(eye_color, length) 
     self.gender = str(gender) 

x = Parent("Blue", 2) 
y = Child("Men") 

print(x.length, x.eye_color) 
print(y.gender, x.length) 

在孩子,參數eye_color和長度都來自無處。

rassar如果要重新使用父對象,示例很不錯。

你也可以做到以下幾點:

class Parent: 
    # def __init__(self, eye_color=(default value here), length=(default value here)): 
    def __init__(self, eye_color="", length=0): 
     self.eye_color = str(eye_color) 
     self.length = length 

OR

class Parent: 
    def __init__(self, eye_color, length): 
     self.eye_color = str(eye_color) 
     self.length = length 

class Child(Parent): 
    def __init__(self, gender, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.gender = str(gender) 

x = Parent("Blue", 2) 
y = Child("Men") # Work with first example of Parent 
y = Child("Men", eye_color="Blue", length=2) # Work with first 
y = Child("Men", "Blue", 2) # Work with second example 

print(x.length, x.eye_color) 
print(y.gender, x.length) 
+0

謝謝,這真的很有幫助,但我認爲rassar解決方案對我來說是一個更好的方法,無論如何,我會嘗試編碼並查看最佳使用方法。 – stickfigure4

+0

公平地說,也許OP的問題沒有意義,但我發現這個頁面正好適合這個解決方案,因爲這是C++中的繼承。 – ApplePie