2016-11-15 3 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) 

Abe находится в комнате 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

Наследование - это отношения «есть». В вашем дизайне имеет смысл сказать: «Третий этаж - отель» - не совсем. Ваш отель отслеживает, сколько этажей у него есть ... так, сколько этажей занимает третий этаж? Вы также должны абстрагироваться от пола. Прямо сейчас вам нужно дублировать класс для каждого пола, когда вам, вероятно, понадобится один класс «Этаж», и вы поместите несколько из них в список или dict в классе «Отель». Тогда вы можете с уверенностью сказать: «В моем отеле есть полы». – tdelaney

+0

Я вижу. В этом есть смысл. Поэтому, если я так делаю, как бы я дал каждому этажу уникальную функцию, которую вы не можете получить с других этажей? – Daniel

ответ

0

Я думаю, вы пытаетесь понять, как применять наследование к дизайну, который вы показываете, потому что это не имеет большого смысла. A Hotel - это не то же самое, что комната в гостинице, но ваш текущий класс Hotel имеет атрибуты, связанные с человеком в одноместном номере.

Если вы хотите класс с этими атрибутами, вы, вероятно, должны сделать класс Room с экземплярами для каждой комнаты или, возможно, Guest класс для человека, проживающего в номере. A floor может быть контейнером (например, списком), вмещающим несколько комнат. Или, может быть, должен быть класс Floor, который содержит список комнат, а также некоторые дополнительные данные и методы.

Возможно, было бы лучше, если бы FirstFloor и SecondFloor не были отдельными классами, а были экземплярами одного и того же класса с разными данными. Это часто признак того, что вам действительно не нужно писать класс, если только его будет только один экземпляр!

Использование одного класса для всех этажей ограничивает вашу способность добавлять дополнительные методы только на один этаж. Но подумайте, когда вы сможете назвать такой метод. Если только один этаж имеет метод computer_lobby, можете ли вы когда-нибудь позвонить some_floor.computer_lobby(), когда вы не знаете заранее, какой тип объекта содержит переменная some_floor? Наверное, нет, так как он потерпит неудачу, если это какой-то пол, а второй.

Более разумный дизайн будет заключаться в том, чтобы сделать «особый» материал о каждом дне данных, а не о методах.Возможно, ComputerLobby является специальным подклассом Room, который может содержаться в списке в экземпляре класса Floor.