Python Traceback和NameError

时间:2012-11-11 21:17:13

标签: python nameerror traceback

我对编程很新。我一直在尝试通过一本名为“绝对初学者的Python编程”的书来学习Python。我正在上课。我已经从书中的一个练习中复制了一些代码,并获得了一个Traceback(最近一次调用最后一次):和NameError消息。以下是我与代码相关的错误消息。请帮忙。谢谢!

Traceback (most recent call last):
 File "C:\Python27\Ch8 Critter Caretaker Prg.py", line 5, in <module>
   class Critter(object):
 File "C:\Python27\Ch8 Critter Caretaker Prg.py", line 25, in Critter
   mood = property(__get_mood)
NameError: name '_Critter__get_mood' is not defined
# Critter Caretaker
# A virtual pet to care for

class Critter(object):
"""A virtual pet"""
    def __init__(self, name, hunger = 0, boredom = 0):
        self.name = name
        self.hunger = hunger
        self.boredom = boredom
    def __pass_time(self):
        self.hunger += 1
        self.bordedom += 1
    def __get_mode(self):
        unhappiness = self.hunger + self.boredom
        if unhappiness < 5:
            mood = "happy"
        elif 5 <= unhappiness <= 10:
            mood = "okay"
        elif 11 <= unhappiness <= 15:
            mood = "frustrated"
        else:
            mood = "mad"

    mood = property(__get_mood)

    def talk(self):
        print "I'm", self.name, "and I feel", self.mood, "now.\n"
        self.__pass_time()

    def eat(self, food = 4):
        print "Brrupp.  Thank you."
        self.hunger -= food
        if self.hunger < 0:
            self.hunger = 0
        self.__pass_time()

    def play(self, fun = 4):
        print "Wheee!"
        self.boredom -= fun
        if self.boredom < 0:
            self.boredom = 0
        self.__pass_time()

def main():
    crit_name = raw_input("What do you want to name your critter?: ")
    crit = Critter(crit_name)

    choice = None
    while choice != "0":
        print \
        """
        Critter Caretaker

        0 - Quit
        1 - Listen to your critter
        2 - Feed your critter
        3 - Play with your critter
        """

        choice = raw_input("Choice: ")
        print

        # exit
        if choice == "0":
            print "Good-bye."

        # listen to your critter
        elif choice == "1":
            crit.talk()

        # feed your critter
        elif choice == "2":
            crit.eat()

        # play with your critter
        elif choice == "3":
            crit.play()

        # some unknown choie
        else:
            print "\nSorry, but", choice, "isn't a vaild choice."

main()
("\n\nPress the enter key to exit.")

3 个答案:

答案 0 :(得分:2)

如前所述,您在modemood之间输了一个拼写错误。但是,您将在以后遇到更多问题 - 您的__get_mood函数从未真正获得情绪,因为它永远不会返回。此外,您可以使用property作为装饰者:

@property
def mood(self):
    unhappiness = self.hunger + self.boredom
    if unhappiness < 5:
        return "happy"
    elif 5 <= unhappiness <= 10:
        return "okay"
    elif 11 <= unhappiness <= 15:
        return "frustrated"
    else:
        return "mad"

答案 1 :(得分:1)

您似乎打算将__get_mode(self)定义为__get_mood(self)

为了对您获得的NameError做出一些澄清,由于name mangling,解释员说_Critter__get_mood is not defined而不是__get_mood is not defined,这是Python的一种表达{ {1}}类中的变量或方法。

答案 2 :(得分:0)

这是一个简单的错字。你定义

def __get_mode(self):
#          ^^^

但访问

_Critter__get_mood
#              ^^^