2014-01-14 95 views
2
class Character(Entity): 
    def __init__(self, x, y, hp): 
     Entity.__init__(self, x, y) 
     self.hp = hp 
     self.items = [] 

Character是父類Entity的子類。 Entity類也具有__init__的功能。爲什麼需要編寫__init__函數?爲什麼不僅寫__init__()Character類,這會覆蓋__init__()Entity嵌套構造函數。爲什麼需要?

回答

3

這取決於在Entity.__init__中發生了什麼!如果(和只有)它是所有設置self.xself.y,你可以這樣做:

class Character(Entity): 
    def __init__(self, x, y, hp): 
     self.x = x 
     self.y = y 
     self.hp = hp 
     self.items = [] 

但是,這是一個線長已,而如果別的不是實例的屬性被設置參數等在Entity.__init__中完成(例如,self.items = []Character.__init__中),您的Character可能無法正常工作。

這是一個很好的做法,稱爲超級的__init__方法,以確保需要完成的一切都完成。

你可以讓你的代碼中使用super更普遍的:

class Character(Entity): 
    def __init__(self, x, y, hp): 
     super(Character, self).__init__(x, y) 

所以,如果你改變什麼從__init__Character繼承仍然有效。

1

你可以這樣做,但你不會調用超類的構造函數(Entity)。在這種情況下,由構造函數來確保對象以一致的狀態結束。

另一種方法是調用超類的構造函數,然後執行一些Character實例所需的進一步操作。這意味着您已經有一個處於一致狀態的對象(Entity構造函數完成之後),並且只針對Character對象進行了進一步的調整。

+0

\ __ init__不是構造函數 – volcano

+0

@volcano:從技術上講,你是對的,儘管實際上'__init__'用於初始化對象(因此它與其他語言的構造函數有相似的用途)。 –

+0

其他語言的構造函數雖然分配內存並返回對象引用 – volcano

0

這取決於類應該做什麼。

如果我們假設類分別發起他們自己的東西,那麼你看到

  • Entity inits其自身的屬性xy
  • Character inits其附加屬性hpitems

你可以放xyCharacter初始化爲好,但再怎麼樣Entity本身和TIS等子類?

1

爲什麼需要編寫__init__函數?

沒有。你在這裏做兩件完全不同的事情:

  • 定義Character.__init__,並且
  • 呼叫Entity.__init__

正如你已經注意到自己,Character__init__方法覆蓋Entity的。所以如果你想要調用它,你需要從Character中明確地調用它。

0

不加入上面已經說過的內容 - 調用__init__方法構造函數是一個常見的錯誤 - 但它不是
構造函數是__new__方法,很少使用。 Python文檔在這個問題上有點神祕 - see here,但它從不直接調用它的構造函數。爲什麼?構造函數 - 在標準的OOP術語中,創建類實例 - 對象並返回它。 __init__只需不會這樣做

相關問題