Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在类中保留持久变量时遇到问题_Python_Oop - Fatal编程技术网

Python 在类中保留持久变量时遇到问题

Python 在类中保留持久变量时遇到问题,python,oop,Python,Oop,我正在尝试编写一个脚本来猜测1-100之间的数字,并根据用户是否说数字太高或太低做出适当的响应,直到它猜到正确的数字。我的代码现在运行(Python2.7),但是猜测没有更新,即使我继续调用一个新的make\u guess。我的想法是: 初步估计50 被告知猜测是高、低还是正确 根据2中函数调用返回的答案调整猜测,并更新my_guess变量 继续,直到猜对为止 以下是我目前的代码: class Number_Guesser(object): lower_bound = 1 upp

我正在尝试编写一个脚本来猜测1-100之间的数字,并根据用户是否说数字太高或太低做出适当的响应,直到它猜到正确的数字。我的代码现在运行(Python2.7),但是猜测没有更新,即使我继续调用一个新的
make\u guess
。我的想法是:

  • 初步估计50
  • 被告知猜测是高、低还是正确
  • 根据2中函数调用返回的答案调整猜测,并更新
    my_guess
    变量
  • 继续,直到猜对为止
  • 以下是我目前的代码:

    class Number_Guesser(object):
        lower_bound = 1
        upper_bound = 100
    
        def initialize(self,lower_bound,upper_bound):
            self.lower_bound = lower_bound
            self.upper_bound = upper_bound
            self.number_of_guesses = 1
    
        def guess_and_adjust(self):
            while True:
                self.anticheat()
                my_guess = self.make_guess()
                answer = input('Enter 1 if your number is higher, 2 if it\'s lower, or 3 if I was correct!')
                if answer=='1':
                    self.lower_bound = my_guess + 1
                    self.number_of_guesses = self.number_of_guesses + 1
                elif answer=='2':
                    self.upper_bound = my_guess - 1
                    self.number_of_guesses = self.number_of_guesses + 1
                elif answer=='3':
                    print 'Woohoooo! I guessed your number in {0} guesses!'.format(self.number_of_guesses)
    
        def anticheat(self):
            if self.lower_bound > self.upper_bound:
                print 'You cheated! We\'re done here!'
                quit()
    
        def make_guess(self):
            self.current_guess = (self.upper_bound + self.lower_bound)/2
            print 'my guess is {0}'.format(self.current_guess)
            return self.current_guess
    
    n = Number_Guesser()
    n.guess_and_adjust()
    
    本质上,我的问题是我的代码哪里出了问题,以至于我的
    my_guess
    变量没有更新?

    一些要点:

    • 您的代码不起作用,因为在Python2(而不是3!)中,内置的
      input()
      函数调用输入字符串上的
      eval()
      (evaluate,也称为将字符串转换为Python对象)。这意味着,如果键入
      1[输入]
      ,结果将不是
      “1”
      ,而是
      1
      。改变这种情况的最好方法是使用
      raw\u input()
      ,它不会计算输入流。您还应该检查输入是否无效

    • 从不调用
      initialize
      方法。这是因为在Python中,“构造函数”函数被称为
      \uuuu init\uuuu
      。因此,调用
      MyClass(1,2,3)
      将调用
      MyClass.\uuu init\uuuuuuuuuuuuuuuuuuuuuself,1,2,3)
      当且仅当定义了
      MyClass.\uuuuuuu init\uuuuuuuuuuuuuuuuuu

    • 由于上述原因,在类内声明
      下限
      上限
      不是一个好主意。将它们作为参数传递给
      \uuuu init\uuu

    • 您可以说
      x+=y
      而不是使用
      x=x+y
      模式

    • 找到正确答案后,您应该退出程序(或重新启动程序)

    考虑到这一点,您的代码应该如下所示

    class Number_Guesser(object):
        def __init__(self,lower_bound,upper_bound):
            self.lower_bound = lower_bound
            self.upper_bound = upper_bound
            self.number_of_guesses = 1
    
        def guess_and_adjust(self):
            while True:
                self.anticheat()
                my_guess = self.make_guess()
                answer = raw_input('Enter 1 if your number is higher, 2 if it\'s lower, or 3 if I was correct!')
                if answer=='1':
                    self.lower_bound = my_guess + 1
                    self.number_of_guesses += 1
                elif answer=='2':
                    self.upper_bound = my_guess - 1
                    self.number_of_guesses += 1
                elif answer=='3':
                    print 'Woohoooo! I guessed your number in {0} guesses!'.format(self.number_of_guesses)
                    quit()
                else:
                    print 'Hey, that input is invalid!'
    
        def anticheat(self):
            if self.lower_bound > self.upper_bound:
                print 'You cheated! We\'re done here!'
                quit()
    
        def make_guess(self):
            self.current_guess = (self.upper_bound + self.lower_bound) / 2
            print 'My guess is {0}.'.format(self.current_guess)
            return self.current_guess
    
    n = Number_Guesser(1, 100)
    n.guess_and_adjust()
    

    你是如何确定你的猜测没有更新的?您能否将示例输出添加到您的问题中,并解释您期望的输出?我注意到
    guess\u和
    方法中的
    while
    循环永远不会存在,即使猜测是正确的;这将接受用户输入并将其解释为Python表达式。当您在提示下输入
    1
    时,Python会接受该值,将该值解释为Python表达式,并生成整数值
    1
    。但是,您的代码正在测试字符串,因此除非您输入
    '1'
    (带文字引号),否则您的
    答案
    测试将永远无法工作,您将得到一个无限循环。您应该使用
    原始输入()
    ,而不是使用
    输入(),它不尝试将输入解释为Python代码,只返回字符串。您也从未调用
    Number\u Guesser.initialize()
    方法,因此从未设置
    self.Number\u of\u guesses
    ,因此,当您输入
    '1'
    '2'
    '3'
    @MartijnPieters时,您会得到一个
    属性错误:“数字猜测者”对象没有属性“数字猜测者”
    异常,您的智慧是无限的。非常感谢你的帮助!非常感谢!我不知道为什么我写了
    initialize
    而不是init。。一定是晚上的时间:P