Python, требующий преобразования атрибута в строку

1
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 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

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

  • 0
    "заставить класс карты работать ..." определить?
  • 1
    я не знаю, в чем вопрос или даже решение. Но история была забавным прочитанным.
Теги:
class
string
attributes

5 ответов

1
Лучший ответ

Может быть, вы хотите что-то вроде этого?

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 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 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
    это приближает меня теперь у меня возникает ошибка синтаксиса при попытке играть в игру: файл "ec42.py", строка 161 e = Engine (m, "princess_lives_here") ^ SyntaxError: неверный синтаксис ... это просто означает, что мне нужно назначить новый переменная для запуска строки или я должен просто покончить со всей переменной 'e'?
  • 0
    Я изменил вышеупомянутый класс. Теперь код работает. Конечно, вам все еще нужно реализовать функцию gold_koi_pond, но я думаю, что вы должны получить суть потока управления через приведенный выше код (попробуйте ввести «eat it»)
Показать ещё 3 комментария
1
def __init__(self, start, quips):

...

e = Engine(m, "princess_lives_here")

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

  • 0
    проблема здесь, хотя это ошибка типа: init принимает 2 аргумента (1given)
0

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

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

  • 0
    @ user589983 когда я исправил добавление next в кавычках, я получил трассировку, что у 'Engine' нет объекта 'next'. поэтому вместо этого я вставил «карту», а затем получил трассировку: объект «карта» не может быть вызван ... где я здесь ошибаюсь? мне нужно полностью изменить способ вызова класса карты из движка классов?
0

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

room = getattr(self, 'next')

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

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

  • 0
    Это все равно даст ему ошибку AttributeError , если судить только по заданному фрагменту.
0

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

room = getattr(self, next)

должен идти больше по линиям

room = getattr(self, 'next')

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню