0

我对编程很陌生。我一直在尝试通过一本名为“Python Programming for the Absolute Beginner”的书来学习 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.")
4

3 回答 3

2

如前所述,您在modeand之间打错了字mood。但是,您稍后会遇到更多问题 - 您的__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"
于 2012-11-11T21:21:36.077 回答
1

看起来您打算改为定义__get_mode(self)__get_mood(self)

为了澄清NameError你所得到的,解释器说,_Critter__get_mood is not defined而不是__get_mood is not defined因为name mangling,这是 Python 对指示private类中的变量或方法的一些幻想。

于 2012-11-11T21:23:49.330 回答
0

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

def __get_mode(self):
#          ^^^

但访问

_Critter__get_mood
#              ^^^
于 2012-11-11T21:20:20.617 回答