while循环Python类属性

时间:2012-03-08 16:37:13

标签: python class while-loop

'while'不会'破坏'时 self.text由kill函数设置为''。

有人可以帮助我完成这项工作或建议更好的方法吗? 如果字符串变为“',则需要通过10个以上的函数运行字符串 在每个函数内部返回似乎是多余的。

class Class(object):
    def run(self, text):
        self.text = text

        while self.text:
            self.nothing1()
            self.kill()
            self.nothing2()
            return self.text # stop if all functions run

    def nothing1(self):
        print 'nothing1'
        self.text = self.text

    def kill(self):
        print 'kill'
        self.text = ''

    def nothing2(self):
        print 'nothing2'
        self.text = self.text

C = Class()
C.run('some string')

澄清: 目标是通过许多函数运行一个字符串,只要一次停止,如果任何一个函数将字符串设置为“”,我显然误解了'while'的工作方式,这对我来说似乎是最干净的方式。

4 个答案:

答案 0 :(得分:4)

更新2:如果您的目标是通过多个函数运行字符串,那么您的设计基本上都是错误的。

每个函数都不应该设置成员,而是接受一个字符串,然后返回一个字符串。然后你的循环应测试该值是否良好:

currstr = 'foo'
for f in (self.nothing1, self.kill, self.nothing2):
    tmpstr = f(currstr)
    if not tmpstr: break # or return, or raise exception
    currstr = tmpstr

更新:显然你的问题是你不喜欢while循环的工作方式。虽然循环只在执行到达测试时中断 - 也就是说,一旦执行进入正文,没有中断或异常,它将继续到块的结尾,然后才会重新评估测试。

最简洁的方法可能就是用property包裹self.text

然后,对属性函数中的逻辑有三个合理的选择:

  1. 您可以创建一个在更改属性时调用的处理程序系统,并在那里执行任何您喜欢的操作(包括接下来两个选项之一的逻辑);
  2. 包含对空字符串的特定测试,并在其上引发异常,并在循环外处理它;或
  3. 在每次更改时提出异常,并在循环内处理它。
  4. 您还有另一个选项,即在kill中引发异常,其方式与上述方法大致相同。


    您的代码非常适合我:

    In [139]: cpaste
    Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
    :class Class(object):
    :    def run(self, text):
    :        self.text = text
    :
    :        while self.text:
    :            self.nothing1()
    :            self.kill()
    :            self.nothing2()
    :
    :    def nothing1(self):
    :        print 'nothing1'
    :        self.text = self.text
    :
    :    def kill(self):
    :        print 'kill'
    :        self.text = ''
    :
    :    def nothing2(self):
    :        print 'nothing2'
    :        self.text = self.text
    :
    :C = Class()
    :C.run('some string')
    :--
    nothing1
    kill
    nothing2
    

答案 1 :(得分:2)

在执行每个函数后,您需要添加text ''的检查:

class Class(object):
    def run(self, text):
        self.text = text

        func_to_exec = [self.nothing1,self.kill,self.nothing2]
        while True:
            for func in func_to_exec:
                func()
                if not self.text:
                    break
            else:
                continue #executed only if no 'break' was met (starts the next iteration of `while` loop)
            break #get out of the 'while True' loop


    def nothing1(self):
        print 'nothing1'
        self.text = self.text

    def kill(self):
        print 'kill'
        self.text = ''

    def nothing2(self):
        print 'nothing2'
        self.text = self.text

输出:

>>> C.run('some string')
nothing1
kill

答案 2 :(得分:1)

虽然看起来多余,但如果在每个函数中返回字符串,可以缩短循环。使用延迟评估,这是解决问题的更具功能性的方法:

def run(self, text):
        self.text = text

        func_to_exec = [self.nothing1, self.kill, self.nothing2]
        all(func() for func in func_to_exec) # generator will evaluate func lazily

很好,很清楚,有评论。

答案 3 :(得分:0)

如果属性变为'',则编写一个提升StopIteration的装饰器。