2013-05-09 3 views
0

Я делаю текстовую игру, и это файл, который я использую для определения атрибутов комнат. Всякий раз, когда я пытаюсь проверить этот файл из напечатав описание номера в room3 (печать Room3.desc) Я получаю сообщение об ошибке: AttributeError: тип объекта «Комната3» не имеет атрибута «DESC»Как вы печатаете атрибут подкласса?

class Room: 
    def __init__(self, x, y, desc): 
     self.x=x 
     self.y=y 
     self.desc=desc 



class Room1(Room): 
    def __init__(self, x, y, desc): 
     super(Room1, self).__init__() 
     self.x=0 
     self.y=0 
     self.desc=""" 

     A Metal Hallway 
     This place is dimly lit and cool 
     ---------------------------------------------------- 
     You stand in the middle of an intersection in a metal room. 
     There are blue glowing lamps lighting this area up. There 
     is a sign on the wall. 
     ---------------------------------------------------- 
     Obvious exits:East, North""" 

class Room2(Room): 
    def __init__(self, x, y, desc): 
     super(Room2, self).__init__() 
     self.x=1 
     self.y=0 
     self.desc=""" 

     Thacker's Main Control Room 
     This place is well lit and cool 
     ---------------------------------------------------- 
     There are multiple panels throughout with a variety of levers and buttons. 
     People stand in uniforms infront of computers, which are scattered throughout the room. 
     There is a glass window here revealing space. 
     Thacker is sitting here in the back of the room in a large chair. 
     ---------------------------------------------------- 
     Obvious exits:West""" 

class Room3(Room): 
    def __init__(self, x, y, desc): 
     super(Room3, self).__init__() 
     self.x=0 
     self.y=1 
     self.desc== """ 


     Large Hanger Bay 
     This place is well lit and cool 
     ---------------------------------------------------- 
     There are a variety of mobile suits here 
     ---------------------------------------------------- 
     Obvious exits:South""" 


print("%s" % Room3.desc) 

ответ

-1

self.desc== """

Есть дополнительно =. И вы должны создать экземпляр Room3 для доступа к атрибуту desc.

+0

хороший момент, пропустил дополнительный '=' присваивание должно быть 'self.desc =«»" 'не 'self.desc ==" "" ' – cmd

0

Room3 класс не имеет атрибута desc. Случаи этого класса. Так что-то подобное будет работать:

room3 = Room3() 
print(room3.desc) 
1

Ваших __init__ методов определение атрибутов экземпляров, а не классы. Если у вас что-то вроде этого:

class Room3(Room): 
    desc = 'foo' 
    ... 

Тогда будет такая вещь, как Room3.desc. Как это, вам нужно будет что-то вроде этого:

r = Room3(x, y, 'foo') 
print(r.desc) 

Для более, изучить учебник, раздел Классы, в docs.python.org.

1

Room3.desc - это атрибут , а не класс атрибут. Вы не можете получить доступ к атрибутам экземпляра объекта класса - их там не существует.

Вы не используете экземпляр Room3, а класс, поэтому вы не можете получить доступ к атрибуту, который не существует. Вы можете создать экземпляр, если одноразовый вы хотите получить доступ к атрибуту экземпляра по умолчанию:

print Room3(None, None, None).desc 

Кроме того, ваши звонки на ваш суперкласс INIT методов будут терпеть неудачу в строительстве экземпляра, потому что вы не передавая необходимые аргументы ,

1

cmd Как говорит desc не является атрибутом объекта Room3 класса, это атрибут каждого Room3экземпляра.

Я думаю, что реальная проблема здесь состоит в том, что вы не хотите Room3 быть подклассом Room; вам просто нужен экземпляр от Room. Нет кода или атрибутов, характерных для Room3, и трудно себе представить, что вы собираетесь создать кучу Room3 экземпляров.

Так что вы, вероятно, хотите, это:

room3 = Room(1, 0, """blah blah""") 

Теперь вы можете print room3.desc, и он будет работать нормально.


Между тем, если вы сделать хотите Room3 быть классом, есть много проблем с дизайном:

def __init__(self, x, y, desc): 
    super(Room3, self).__init__() 
    self.x=0 
    self.y=1 
    self.desc== """…""" 

Во-первых, что super вызов будет вызывать исключение, потому что Room.__init__ принимает параметры x, y и desc, и вы не проходите мимо них. Вы должны изменить его на super(Room3, self).__init__(x, y, desc).

Но как только вы исправите это, базовый класс собирается установить self.x и т. Д., Просто для того, чтобы вы немедленно заменили их новыми значениями. Зачем это делать? И почему даже принимаютx, y и desc параметры просто игнорируют их?

Я думаю, что вы хотите это:

def __init__(self): 
    super(Room3, self).__init__(0, 1, """…""") 

Это на самом деле довольно распространенная модель (хотя и не так часто, как в таких языках, как C++ и Java), где у вас есть базовый класс, который содержит некоторые переменные который может принимать произвольные значения и подклассы, которые имеют определенные значения для некоторых из этих переменных.

Но, как я уже сказал, я не думаю, что это шаблон, который вы хотите здесь. Я думаю, вам просто нужен экземпляр room3Room, а не подкласс.


Наконец, чтобы ответить на этот вопрос, вы сразу спросил: «Как вы печатаете атрибут подкласса?», Это легко. Просто распечатайте его. Вот как работает утиная печать. Например:

class Base(object): 
    def print_x(self): 
     print self.x 

class Derived(Base): 
    def __init__(self, x): 
     self.x = x 

base = Derived(3) 
base.print_x() 
2

Вы пытаетесь получить доступ к desc через ссылку на сам класс, но в обратном порядке определяется в конструкторе, что означает, что он доступен только в случаях класса.

Это указывает на общую проблему с вашим кодом: вы определяете подклассы номер, когда то, что вы действительно хотите, чтобы создавать экземпляры класса Room:

room1 = Room(0, 0, """A Metal Hallway...") 
room2 = Room(1, 0, """Thacker's main control room...") 
etc... 
+0

Будет знать, о чем говорит ГЭС. Как вы это делаете, вы делаете комнату, которая не то, что вы хотите. Вы хотите, чтобы объекты комнаты, такие как 'room1 = Room (0,0, '' 'bla' '')', а затем, как только вы это сделаете, вы можете начать звонить .desc, как вы делали 'room1.desc, room2 .desc, etc' – TehTris

+0

Спасибо! Вы разъяснили мне, оцените это. –

1

print("%s" % Room3.desc)

desc является атрибут экземпляра Room3, а не самого класса Room3. Если вы инициируете Room3, вы можете получить доступ к его атрибуту desc. Также будьте осторожны с вашим __init()__, как у вас есть дополнительный =

class Room3(Room): 
    def __init__(self, x, y, desc): 
     super(Room3, self).__init__() 
     self.x=0 
     self.y=1 
     self.desc== """ 

последняя строка должна быть self.desc= """

Смежные вопросы