2017-08-07 101 views
1

我想創建一個子類的子類(Barrier是一種類型的牆,這是一種障礙),並且我想要屏障有相同的初始化作爲牆的方法,但self.type ='障礙'的例外,但我不知道如何做到這一點(我對編程非常新,所以我很抱歉,如果這是非常簡單的但我一直無法找到我理解的答案)。到目前爲止,我有:在Python 2的子類中覆蓋__init__方法的一部分

class Obstacle: 
    def __init__(self, type): 
     self.type = 'obstacle' 

    def __str__(self): 
     return "obstacle" 

class Wall(Obstacle): 

    def __init__(self, origin, end): 

     self.type = 'wall' 
     self.origin = origin 
     self.end = end 

     # etc.... (i.e. there are more things included in here which the 
     # that the barrier also needs to have (like coordinate vectors etc.) 

class Barrier(Wall): 

    def __str__(self): 
     return "Barrier obstacle" 

我如何改變它,這樣類障礙有初始化方法的相同內容的牆壁做,除非他們的「self.type =‘壁壘’」?

回答

4

只需重寫一個屬性調用Wall版本之後:但是

class Barrier(Wall): 
    def __init__(self, origin, end): 
     super().__init__(origin, end) 
     self.type = 'barrier' 

    def __str__(self): 
     return "Barrier obstacle" 

你可能要考慮使用類屬性代替;沒有任何實例屬性是動態的,並且對於每個類的實例都是特定的。每個類的type屬性肯定不會改變從一個實例到另一個:

class Obstacle: 
    type = 'obstacle' 

    def __str__(self): 
     return self.type 

class Wall(Obstacle): 
    type = 'wall' 

    def __init__(self, origin, end): 
     super().__init__() 
     self.origin = origin 
     self.end = end 
     # etc.... (i.e. there are more things included in here which the 
     # that the barrier also needs to have (like coordinate vectors etc.) 

class Barrier(Wall): 
    type = 'barrier' 
+0

我剛剛嘗試過這樣做,但在嘗試創建類的實例時遇到錯誤,因爲它表示Barrier的__init__只有一個參數,但我還需要給出起點和終點? –

+0

@JDope:我的錯誤,改正了。 –

2

由於「類型」似乎取決於類,我根本就沒有type屬性的對象,但在一流水平

class Obstacle: 

    type = 'obstacle' 

    def __init__(self): 
     # do something 
     pass 

    def __str__(self): 
     return "obstacle" 

class Wall(Obstacle): 

    type = 'wall' 

    def __init__(self, origin, end): 
     super().__init__() 
     self.origin = origin 
     self.end = end 

class Barrier(Wall): 

    type = 'barrier' 

    def __str__(self): 
     return "Barrier obstacle"

而且你最好叫super().__init__方法,如果你將其覆蓋。因爲否則在類層次結構中更高的初始化將不會發生(這有時是期望的行爲,但通常不是)。

這樣做的好處是它 - 至少在我看來 - 更優雅。因爲這裏很明顯,每個類都定義了type。但是此外它會減少使用的內存量。由於我們每個類存儲一個屬性,因此我們每個對象存儲一個而不是

但是,如果您想改變單個對象的屬性,這仍然是可能的。例如:

>>> obs1 = Obstacle() 
>>> weird_obs = Obstacle() 
>>> weird_obs.type = 'weird obstacle' 
>>> obs2 = Obstacle() 
>>> obs1.type 
'obstacle' 
>>> weird_obs.type 
'weird obstacle' 
>>> obs2.type 
'obstacle' 

因此,我們仍然可以靈活地將特定類型添加到特定對象。但默認情況下,如果我們查詢障礙type,它將執行回退並返回在類級別上定義的type

+1

只是爲了防止OP不理解:在__init__中使用'self.type ='barrier''和類齒列下的'type ='barrier''之間的區別在於後者創建了一個「靜態「變量。這基本上意味着'type'屬性將在Barrier的所有實例中共享。這樣做的好處是,由於'type ='barrier''永遠不會改變每個實例,所以您可以讓所有實例共享一個屬性,而不是讓每個實例都擁有它自己的屬性。 –