python类语法混乱
我从一个教程中创建了这段代码,但很难理解一个关键概念:“next”如何变为字符串“s”?self.start如何引用该字符串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!
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将实例和属性作为字符串,并返回属性对象。当您第一次初始化类时,将入口点设置为函数spaghettiplay()
然后根据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
这是一堆毫无意义的逻辑,没有任何上下文来解释为什么您可能想要这样构造一个程序,因此我可以理解为什么它会令人困惑。当您第一次初始化该类时,您将入口点设置为函数spaghettiplay()
然后根据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
谢谢,您的解释有帮助!我从一个教程中获取了代码,我只是想了解这个代码是如何工作的。谢谢,你的解释很有帮助!我把密码从