python类中的属性
我在更新python类中的属性时遇到问题,我给出了一个小示例python类中的属性,python,class,attributes,self,Python,Class,Attributes,Self,我在更新python类中的属性时遇到问题,我给出了一个小示例 #!/usr/bin/python # -*- coding: utf-8 -*- class myClass(): def __init__(self): self.s=0 self.procedure() def procedure(self):#{{{ s=self.s print s self.operation()
#!/usr/bin/python
# -*- coding: utf-8 -*-
class myClass():
def __init__(self):
self.s=0
self.procedure()
def procedure(self):#{{{
s=self.s
print s
self.operation()
print s
def operation(self):#{{{
s=self.s
s+=1
self.s=s
print "o:",self.s
c=myClass()
然后输出
0
o: 1
0
为什么最后一个数字是0而不是1?您在最后一次打印中打印的是s而不是self.s。您在最后一次打印中打印的是s而不是self.s。在
myClass.procedure()
中,您使用从self.s
复制的值创建本地名称s
,即0
。在myClass.operation()
中,将self.s
设置为1
。但是在myClass.procedure()
中,您没有将以前的副本覆盖到s
,因此它仍然是0
在myClass.procedure()
中,您使用从self.s
复制的值创建本地名称s
,即0
。在myClass.operation()
中,将self.s
设置为1
。但是您尚未在myClass.procedure()
中将上一个副本覆盖到s
,因此它仍然是0
您的过程
代码应为:
def procedure(self):#{{{
s=self.s
print s
self.operation()
# the following line is edited
print self.s
否则,您更改的变量(
self.s
)不会打印。您的过程应为:
def procedure(self):#{{{
s=self.s
print s
self.operation()
# the following line is edited
print self.s
否则,您更改的变量(self.s
)不会打印。,因为s=self.s
不会使s
成为“通过检查self.s
得到的任何东西,总是和永远”的另一个名称;它使s
成为“无论self.s
当前所指的是什么”的另一个名称
整数0
是一个对象。在第一个函数中,您使self.s
和s
都引用该对象,然后使self.s
通过另一个s
引用另一个函数本地的对象(添加的结果)。第一个函数的本地s
没有改变。因为s=self.s
不会使s
成为“通过检查self.s
得到的任何东西,总是和永远”的另一个名称;它使s
成为“无论self.s
当前所指的是什么”的另一个名称
整数0
是一个对象。在第一个函数中,您使self.s
和s
都引用该对象,然后使self.s
通过另一个s
引用另一个函数本地的对象(添加的结果)。第一个函数的s
本地值不变。@JuanPablo,但只有在self.s
设置为其他值时才会更改。@JuanPablo不,不是。原来s
和self.s
是同一对象的两个名称。但是,您可以更改对象的名称,而不更改对象的名称。@JuanPablo,但只有在self.s
设置为其他名称之前。@JuanPablo不,不是。原来s
和self.s
是同一对象的两个名称。但是,您可以更改self.s
为其命名的对象,而不更改s
为其命名的对象。