模块中的Python自变量

时间:2015-02-12 22:16:27

标签: python

在执行此代码时,我预期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]

2 个答案:

答案 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_aself中的mod_amod_b中的[10]相同,因此会将值重新设置为{{1}}。

答案 1 :(得分:1)

self是在python中用于表示“this object”或“current object”的约定 1 。它指的是用于调用函数的对象。虽然它可能因为是一个参数而看起来像一个局部变量,但事实并非如此。它是对象本身的引用。 self中的变量mod_aself中的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,因此选择其他单词将使您的代码更难理解。