2016-11-15 52 views
1

所以我一直在試圖理解類,子類,實例化,以及所有 那些好東西。我一直在試圖編寫一個類似於我看到的更復雜的代碼(或者至少對我來說很難遵循)的簡單代碼,但是 我無法連接所有代碼。Python:類/子類和繼承/確定子類

這是我想要發生的事情。

我們有一個班的酒店。當你進入酒店時,你有一個名字和一個房間號碼 。你房間的數量決定你在哪個樓層。

class Hotel(object): 

    def __init__(self, name, room_number): 
     self.name = name 
     self.room_number = room_number 
     self.floor = self.room_number//10 

所以

Abe = Hotel("Abe", 104) 
print "%s is in room %d on floor %d." % (Abe.name, 
             Abe.room_number, 
             Abe.floor) 

安倍是在104房間地板上1

Bob = Hotel("Bob", 225) 
print "%s is in room %d on floor %d." % (Bob.name, 
             Bob.room_number, 
             Bob.floor) 

鮑勃是在225房間地板2

而且我想第一,二樓是酒店的分類。 Fisrtst地板將有一臺自動售貨機,第二臺將有一個電腦大廳 。

class FirstFloor(Hotel): 
    # Something should go here? 

    def vending_machine(): # something inside the()? 
     print "You buy a soda and feel refreshed." 


class SecondFloor(Hotel): 
    # Something should go here? 

    def computer_lobby(): # something inside the()? 
     print "You have learned to write python!" 

我需要添加什麼才能確定是否可以使用自動售貨機或計算機大廳?

對不起,如果看起來不太正確,我是比較新的,這是我在stackoverflow上的第一篇文章。

+0

繼承是一種「是」的關係。在你的設計中,說「三樓是酒店」是否合理?您的酒店正在跟蹤它有多少樓層......第三層有多少層?你也應該抽象地板。現在,如果您想要單個「樓層」課程,並且您將其中的多個課程放在「酒店」課程的列表或詞典中,則必須爲每層複製課程。然後你可以明智地說「我的酒店有地板」。 – tdelaney

+0

我明白了。這就說得通了。所以,如果我這樣做,我怎麼會給每層樓它獨特的功能,你不能從其他樓層訪問? – Daniel

回答

0

我認爲你很難理解如何將繼承應用於你展示的設計,因爲它沒有多大意義。 A Hotel與酒店房間不同,但您當前的課程Hotel具有與單人房間中的人相關的屬性。

如果你想要一個具有這些屬性的課程,你應該使其成爲一個Room類,每個房間都有實例,或者對於呆在房間裏的人來說,可能需要一個Guest課程。 A floor可能是一個容納多個房間的容器(如列表)。或者,也許應該有一個Floor類包含房間列表以及一些額外的數據和方法。

如果FirstFloorSecondFloor不是單獨的類,而是具有不同數據的同一類的實例,它可能會更好。如果只有一個實例,通常你不需要編寫一個類就可以了!

對所有樓層使用一個班級限制了您向一層樓添加額外方法的能力。但想想你什麼時候可以調用這種方法。如果只有一個樓層有computer_lobby方法,如果您事先不知道變量some_floor包含哪種類型的對象,是否可以撥打some_floor.computer_lobby()?可能不會,因爲如果它是任何樓層而不是第二層,它將會失敗。

更明智的設計是關於每個樓層數據而不是方法的「特殊」內容。也許ComputerLobbyRoom的一個特殊子類,它可以包含在Floor類的實例的列表中。