Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python类中的属性_Python_Class_Attributes_Self - Fatal编程技术网

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()

我在更新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()
        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
为其命名的对象。