2016-10-25 41 views
-1

讓我們假設我有一個名爲一個父類:使用在父類中的打印功能,關於「繼承」變量的定義

class Figure: 
    def __init__(self):   
     self.name = " " 
     self.description = " " 
     self.data = [] 


    def myprint(self): 
     # Print all variables in a special way 

我要創建這個類的幾個孩子的(圓形,矩形...),我想盡可能多地使用繼承。這就是爲什麼我想創建一個myprint功能輸出的所有數據,通用於所有孩子的,即這一個:

 self.name = " " 
     self.description = " " 
     self.data = [] 

什麼是做了正確的方法是什麼?

  1. 我應該包括在課堂上那些行,然後修改他們使用

    Figure.name = 'Circle' 
    
  2. 每一個孩子......或者我應該在每一個孩子創造呢?那麼我將如何使用通用的myprint函數呢?通過這種方式:

class Figure: 
     def __init__(self):   

     def myprint(self): 
      # Print all variables in a special way 

class Cricle(Figure): 
     def __init__(self, radius):   
      name='Circle' 
      pass 
+0

'名稱=圖。 name ='Circle''非常荒謬...... - 在'myprint'中,您只需'print(self.name)',在每個子構造函數(或類定義)中爲'self.name'設置一個不同的值,完成。 – deceze

+0

這是一個錯字。 – D1X

回答

1
class Figure: 
    name = 'Figure' 
    description = "I'm a figure" 

    def __init__(self): 
     self.data = [] 

    def myprint(self): 
     print(self.name, self.description, self.data) 


class Circle(Figure): 
    name = 'Circle' 
    description = "I'm a circle" 

這是你所需要的。如果屬性不是特定的到實例,但對於所有類實例都是相同的,只需在類上定義它們(此處爲namedescription)。在構造函數中只定義了data,因爲[]是可變的,您可能希望它對於每個實例都是唯一的。

然後子類會用不同的值重新定義namedescriptionmyprintFigure實例將打印"Figure",而myprintCircle實例將打印"Circle"。這是因爲self.name指的是當前對象的name屬性,並且該值將根據其是否爲FigureCircle而有所不同。

+0

我有幾個問題:1)當我有變量*特定於實例*會發生什麼?我的意思是諸如* radius *之類的事情,這些事件將依賴於類** Circle **的實例。 2)如果我從未在** Circle **中分配*名稱*並使用* myprint *,會發生什麼情況?會打印出'我是個數字'嗎? 3)你能解釋一下我的意思嗎?「只有數據是在構造函數中定義的,因爲'[]'是可變的,你可能希望它對每個實例都是唯一的」? – D1X

+0

1)將它傳遞給'__init__'並將其存儲在'self':'def __init __(self,radius):self.radius = radius'。 2)是的。 – deceze

+0

@ D1X如果你定義'data'的方式與'name'相同,'Figure'的每個實例將共享相同的'data'變量。如果向列表添加內容,則每個其他實例也會看到添加的數據。因爲它是*類屬性*,而不是*實例屬性*。因爲您只創建*一個列表*,而不是每個實例。 – deceze

1

您在__init__中定義的所有內容都是實例變量。 我想你正在尋找類變量,或者說常量是完全相同的,但是按照慣例用所有的大寫字母來寫。 另外,請看__str__方法here。因此 正確的方法是:

class Figure: 
    NAME = "Figure" 

    def __str__(self): 
     """ override me """ 
     return "I am a {name} and have the default __str__".format(name=self.NAME) 

class Circle(Figure): 
    NAME = "Circle" 

    def __init__(self, x, y, r): 
     self.x, self.y, self.r = x, y, r 

    def __str__(self): 
     return "I am a {name} at ({x}, {y}) with radius {r}".format(
      name=NAME, x=self.x, y=self.y, r=self.r) 

現在你需要做的就是正確的輸出是運行

f = Figure() 
c = Circle(1, 2, 3) 
print(f) 
print(c) 

將輸出

I am a Figure and have my __str__ not overwritten 
I am a Circle at (1, 2) with radius 3