在执行此代码时,我预期0但是得到了[10]。问题是自我是如何工作的,应该在声明类中函数的局部变量时使用它。在mod_a和mod_b中,x.self都被认为是本地的。该列表是第4行返回的结果或者self.variable是一个全局变量声明?
我已经阅读了python文档,它引用了c ++的“this”,但我不知道c ++,因此决定在这里问一下。如果之前已经回答过,请指点我,我认为我在搜索中没有使用正确的关键字。
1 class ExampleClass(object):
2 def mod_a(self):
3 self.x=[10]
4 return self.x
5
6 def mod_b(self):
7 self.x=0
8 self.mod_a()
9 return self.x
10
11 if __name__=="__main__":
12 s=ExampleClass()
13 print s.mod_b()
Output
python test.py
[10]
答案 0 :(得分:2)
self
是当前正在操作的类的实例。注意,名称self
没有什么神奇之处 - 它只是一个像其他任何东西一样的python变量。惯例(强烈)规定变量名为self
。在其他语言中,它有时被称为this
,所以如果你真的想要逆势而行,你可以写一个这样的类:
class Foo(object):
def __init__(this):
this.x = 12
也许为了更多地说明这一点,打印一些Ids是值得的......
class Foo(object):
def print_my_id(self):
print(id(self))
def print_my_id_delegator(self):
self.print_my_id()
f = Foo()
print(id(f))
f.print_my_id()
f.print_my_id_delegator()
现在,如果您查看打印输出,您会注意到所有数字(ID' s)都是相同的。所以,当你写:
f.print_my_id()
python执行:
type(f).print_my_id(f)
与:
相同Foo.print_my_id(f)
通过这种方式来看,您可以清楚地看到此函数调用中的self
是什么(它是f
!)
当然,我们可以使用Foo
...
g = Foo()
print(id(g))
g.print_my_id()
现在我们看到python已经执行了
Foo.print_my_id(g)
当你写下最后一行时。
要使用您的代码将其带回家,在此案例中mod_b
将实例上的x
属性设置为0
,然后调用self.mod_a
。 self
中的mod_a
与mod_b
中的[10]
相同,因此会将值重新设置为{{1}}。
答案 1 :(得分:1)
self
是在python中用于表示“this object”或“current object”的约定 1 。它指的是用于调用函数的对象。虽然它可能因为是一个参数而看起来像一个局部变量,但事实并非如此。它是对象本身的引用。 self
中的变量mod_a
与self
中的mod_b
完全相同 - 它们都指向同一个对象。因此,一种方法中的self.x
在另一种方法中引用了相同的self.x
。
self
允许对象中的所有方法引用一组公共数据。本身不是全局的,只能在对象的方法中可见。
1 注意:self
只是一个约定。你可以使用你想要的任何单词。例如,根据语言规则,以下代码是完全可以接受的:
class ExampleClass(object):
def mod_a(this_object):
this_object.x=[10]
return this_object.x
def mod_b(this_object):
this_object.x=0
this_object.mod_a()
return this_object.x
然而,几乎整个python世界都使用self
,因此选择其他单词将使您的代码更难理解。