Python, требующий преобразования атрибута в строку - PullRequest
1 голос
/ 02 июня 2011
from sys import exit
from random import randint

class Map(object):

 def death(): 
    print quips[randint (0, len(quips)-1)]
    exit(1)

 def princess_lives_here():
    print "You see a beautiful Princess with a shiny crown."
    print "She offers you some cake."

    eat_it = raw_input(">")

    if eat_it == "eat it":
        print "You explode like a pinata full of frogs."
        print "The Princess cackles and eats the frogs. Yum!"
        return 'death'

    elif eat_it == "do not eat it":
        print "She throws the cake at you and it cuts off your head."
        print "The last thing you see is her munching on your face. Yum!"
        return 'death'

    elif eat_it == "make her eat it":
        print "The Princess screams as you cram the cake in her mouth."
        print "Then she smiles and cries and thank you for saving her."
        print "She points to a tiny door and says, 'The Koi needs cake too.'"
        print "She gives you the very last bit of cake and shoves you in."
        return 'gold_koi_pond'

    else:
        print "The Princess looks at you confused and just points at the cake."
        return 'princess_lives_here'

class Engine(object):

 def __init__(self, start, quips):
    self.quips = [
        "You died. You suck at this.",
        "Your mom would be proud, if she were smarter",
        "Such a luser.",
        "I have a small puppy that's better at this."
    ]
    self.start = start

 def play(self):
    next = self.start

    while True:
        print "\n-----"
        room = getattr(self, next)
        next = room()

m = Map()
e = Engine(m, "princess_lives_here")

e.play()

Трассировка, которую я получаю в терминале:

    Traceback (most recent call last):
  File "ec42.py", line 162, in <module>
    e.play()
  File "ec42.py", line 156, in play
    room = getattr(self, next)
TypeError: getattr(): attribute name must be string

Я слишком долго работал над этим и просто не могу его зафиксироватьОсновная проблема заключается в том, чтобы заставить класс карты работать внутри класса движка как объекта.заранее спасибо за помощь.

Ответы [ 5 ]

1 голос
/ 02 июня 2011
def __init__(self, start, quips):

...

e = Engine(m, "princess_lives_here")

Это твоя проблема. Вторая строка вызывает init с аргументами m и "princess_lives_here". Первый аргумент должен быть "princess_lives_here", а второй должен быть списком "quips".

1 голос
/ 02 июня 2011

Может быть, вы хотите что-то подобное?

class Map(object):

 def __init__(self):

    self.quips = [
        "You died. You suck at this.",
        "Your mom would be proud, if she were smarter",
        "Such a luser.",
        "I have a small puppy that's better at this."
    ]

 def death(self): 
    print self.quips[randint (0, len(self.quips)-1)]
    exit(1)

 def princess_lives_here(self):
    print "You see a beautiful Princess with a shiny crown."
    print "She offers you some cake."

    eat_it = raw_input(">")

    if eat_it == "eat it":
        print "You explode like a pinata full of frogs."
        print "The Princess cackles and eats the frogs. Yum!"
        return 'death'

    elif eat_it == "do not eat it":
        print "She throws the cake at you and it cuts off your head."
        print "The last thing you see is her munching on your face. Yum!"
        return 'death'

    elif eat_it == "make her eat it":
        print "The Princess screams as you cram the cake in her mouth."
        print "Then she smiles and cries and thank you for saving her."
        print "She points to a tiny door and says, 'The Koi needs cake too.'"
        print "She gives you the very last bit of cake and shoves you in."
        return 'gold_koi_pond'

    else:
        print "The Princess looks at you confused and just points at the cake."
        return 'princess_lives_here'

class Engine(object):

 def __init__(self, map, start):
    self.quips = [
        "You died. You suck at this.",
        "Your mom would be proud, if she were smarter",
        "Such a luser.",
        "I have a small puppy that's better at this."
    ]
    self.map = map
    self.start = start

 def play(self):
    next = self.start

    while True:
        print "\n-----"
        room = getattr(self.map, next)
    next = room()
0 голосов
/ 02 июня 2011

self.start является экземпляром Map, но вторым аргументом getattr () должна быть строка, имя атрибута.

Кроме того, методы экземпляра должны иметь «self» в качестве первого аргумента.

0 голосов
/ 02 июня 2011

Сообщение об ошибке на самом деле довольно ясно говорит вам, что здесь не так: -)

room = getattr(self, next)

должно идти по линии

room = getattr(self, 'next')

как описано в документации Python

Но это только часть проблемы здесь. Если я правильно угадаю, что вы пропустили в своем примере кода, вам, вероятно, также понадобится добавить метод __call__ к вашему объекту карты. В противном случае room = getattr(self, next) не имеет особого смысла :-) Хорошо, это и остальная часть кода, который, возможно, здесь отсутствует; -)

Также во всех определениях методов класса Map отсутствует аргумент "self".

0 голосов
/ 02 июня 2011

Чтобы вернуть значение именованного атрибута объекта, необходимо указать строку с именем атрибута.

room = getattr(self, 'next')

Из документации по питону: getattr (объект, имя [, по умолчанию])

Возвращаем значение именованного атрибута object.name должна быть строкой . Если строка является именем одного из атрибутов объекта, результатом является значение этого атрибута. Например, getattr (x, 'foobar') эквивалентен x.foobar. Если указанный атрибут не существует, возвращается значение по умолчанию, если оно предусмотрено, в противном случае вызывается AttributeError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...