python类语法混乱

python类语法混乱,python,oop,class,syntax,Python,Oop,Class,Syntax,我从一个教程中创建了这段代码,但很难理解一个关键概念:“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”如何变为字符串“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()

对于第一个问题:getattr返回实例的属性,在本例中是方法
s
,然后使用
attr()
执行它,getattr将实例和属性作为字符串并返回属性对象。

对于第一个问题:getattr返回实例的属性在本例中是方法
s
,然后使用
attr()执行它,getattr将实例和属性作为字符串,并返回属性对象。

当您第一次初始化类时,将入口点设置为函数spaghetti
play()
然后根据
start
的内容启动执行链
getattr(self,next)
将实际获取对具有该名称的类成员的引用,并且
next=attr()
将调用
getattr
返回的成员,并将该调用返回的值分配给
next

至于方法,当next为“s”时,将执行
s
,然后
next
将为“t”,这将导致检索并执行
t
t
中有一个
raw\u输入
调用,这意味着用户可以控制下一个调用。如果用户输入's',
t
将返回's',如果用户输入'v',
t
将返回'v',否则程序将退出
v
只会导致
play
循环回到
s


这是一堆毫无意义的逻辑,没有任何上下文来解释为什么您可能想要这样构造一个程序,因此我可以理解为什么它会令人困惑。

当您第一次初始化该类时,您将入口点设置为函数spaghetti
play()
然后根据
start
的内容启动执行链
getattr(self,next)
将实际获取对具有该名称的类成员的引用,并且
next=attr()
将调用
getattr
返回的成员,并将该调用返回的值分配给
next

至于方法,当next为“s”时,将执行
s
,然后
next
将为“t”,这将导致检索并执行
t
t
中有一个
raw\u输入
调用,这意味着用户可以控制下一个调用。如果用户输入's',
t
将返回's',如果用户输入'v',
t
将返回'v',否则程序将退出
v
只会导致
play
循环回到
s


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

我发现您的代码有点让人困惑,但基本上这里发生的事情与Python类的一个特性有关。由于Python函数是局部作用域的,为了对类对象本身进行任何修改,类的每个方法都将类本身作为其第一个参数,按照称为“self”的约定。此对象将所有变量和方法作为属性

还有一个特殊的
\uuuu init\uuu
函数,在声明该类的实例时调用该函数。它还将
self
作为第一个参数,然后是您希望的任何其他自定义参数

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

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

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

还有一个特殊的
\uuuu init\uuu
函数,在声明该类的实例时调用该函数。它还将
self
作为第一个参数,然后是您希望的任何其他自定义参数

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

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
“next”如何与字符串“s”相等

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

当您执行
a=DemoClass(“s”)
时,将使用参数
self
's'
调用
DemoClass::\uu_init\uuu
。然后
self.start=start
's'
分配给
self.start

调用
a.play()
时,对象将作为第一个参数发送到
play
next=self.start
self.start
中分配给
分配给
下一个

“next”如何与字符串“s”相等

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

当您执行
a=DemoClass(“s”)
时,将使用参数
self
's'
调用
DemoClass::\uu_init\uuu
。然后
self.start=start
's'
分配给
self.start


调用
a.play()
时,对象将作为第一个参数发送到
play
next=self.start
self.start
分配给
\uuuu init\uuuuu
中分配给
next

谢谢,您的解释有帮助!我从一个教程中获取了代码,我只是想了解这个代码是如何工作的。谢谢,你的解释很有帮助!我把密码从