0

我从教程中创建了这段代码,但很难理解一个关键概念:“next”如何变得等于字符串“s”?self.start 如何引用该字符串?

import sys

class DemoClass(object): 

    def __init__(self, start): # executes once!
        self.start = start
        print "_init_"

    def play(self):            # executes once!
        next = self.start
        print "next"

        while True:
            attr = getattr(self, next)  #get attribute of the class
            next = attr()

    def s(self):              # these methods start calling each other once executed
        print "s"
        return 't'

    def t(self):
        print "t"
        i = raw_input(">")
        if i == 's':          # if user input 'i' is equal to 's', call func "s"
            return "s"
        elif i == 'v':
            return "v"
        else:
            exit(0)

    def v(self):
        print "v"
        return 's'  


a = DemoClass("s")
a.play()
4

4 回答 4

2

第一次初始化类时,将入口点设置为函数 spaghetti。 play()然后根据原来的情况启动执行链startgetattr(self, next)实际上将获得对具有该名称的类成员的引用,next=attr()并将调用返回的成员并将getattr该调用返回的值分配给next.

至于方法,当next是's'时,s会执行,然后next是't',这会导致t被检索和执行。 t其中有一个raw_input呼叫,这意味着用户可以控制下一个呼叫。如果用户输入's',t将返回's',如果他们输入'v',t将返回'v',否则程序将退出。 v只是导致play循环回到s.

这是一堆毫无意义的逻辑,没有任何上下文来解释为什么您可能希望以这种方式构建程序,所以我明白为什么它会令人困惑。

于 2012-05-14T18:16:21.380 回答
1

对于您的第一个问题: getattr 在这种情况下返回实例的属性 method s,然后执行它attr(), getattr 将实例和属性作为字符串并返回属性对象。

于 2012-05-14T18:16:11.100 回答
1

我发现您的代码有些混乱,但基本上这里发生的事情与 Python 类的功能有关。因为 Python 函数是局部作用域的,所以为了对类对象本身进行任何修改,类的每个方法都将类本身作为其第一个参数,按照约定称为“self”。该对象具有所有变量和方法作为属性。

还有一个特殊__init__函数,当您声明该类的实例时会调用该函数。这也self作为第一个参数,然后是您希望的任何其他自定义参数。

至于您的问题,以下简化代码是如何's'分配给next

class DemoClass(object):

  def __init__(self, the_input):
    # The input on the class declaration is assigned to the 
    #  class attribute 'start'
    self.start = the_input

  def play(self):
    self.next = self.start


  joe = DemoClass('s')
  print joe.start # prints 's'

  print joe.next # raises error, since joe.next hasn't been defined  

  joe.play()
  print joe.next # also prints 's', now that self.next has been defined
于 2012-05-14T18:20:29.950 回答
1

'next' 如何变得等于字符串“s”

每当调用任何对象方法时,该方法的第一个参数都会自动设置为对象本身。它通常被称为self.

当您这样做时a = DemoClass("s")DemoClass::__init__会使用参数self's'. 然后self.start = start赋值's'self.start

当您调用时a.play(),该对象作为第一个参数发送到play. next = self.startassignsself.start分配给's'in __init__to next

于 2012-05-14T18:20:41.103 回答