-1

使用 self.variable 语法创建变量和不创建变量有什么区别?

我正在对其进行测试,我仍然可以从一个实例访问两者:

class TestClass(object):
    j = 10
    def __init__(self):
        self.i = 20

if __name__ == '__main__':
    testInstance = TestClass()
    print testInstance.i
    print testInstance.j

但是,如果我交换 的位置self,则会导致错误。

class TestClass(object):
    self.j = 10
    def __init__(self):
        i = 20

if __name__ == '__main__':
    testInstance = TestClass()
    print testInstance.i
    print testInstance.j  

>>NameError: name 'self' is not defined

所以我认为 self 在初始化中具有特殊的作用。但是,我只是不太明白它是什么。

4

2 回答 2

6

self指类的当前实例。如果你在函数体之外声明一个变量,你指的是类本身,而不是一个实例,因此类的所有实例将共享该属性的相同值。

此外,声明为类的一部分(而不是实例的一部分)的变量可以作为类本身的一部分进行访问:

class Foo(object):
    a = 1

one = Foo()
two = Foo()

Foo.a = 3

由于这个值是类范围的,你不仅可以直接从类中读取它:

print Foo.a # prints 3

但它也会改变类的每个实例的值:

print one.a # prints 3
print two.a # prints 3

但是请注意,只有当您不使用实例变量覆盖类变量时才会出现这种情况。例如,如果您创建了以下内容:

class Bar(object)
    a = 1
    def __init__(self):
        self.a = 2

然后做了以下事情:

one = Bar()
two = Bar()
two.a = 3

然后你会得到以下结果:

print Bar.a # prints "1"
print one.a # prints "2"
print two.a # prints "3"

如评论中所述,分配 totwo.a在该实例上创建一个实例本地条目,该条目覆盖afrom Bar,因此为什么Bar.a仍然是 1 但two.a为 3。

于 2012-10-10T02:30:32.773 回答
0

j是 Amber 所指向的类变量。现在,如果您来自 C++ 背景,self则类似于this指针。虽然 python 不处理指针,self但它起着引用类当前实例的类似作用。

在 python 方式中,explicit is better than implicit. this在 C++ 中,通常假定每个类的可用性 。另一方面,Python 将self作为第一个参数显式传递给每个实例方法。

因此self,仅在您的实例方法范围内可用,使其undefined适用于您尝试使用它的地方。

由于您必须显式传递self给实例方法,因此如果您愿意,也可以将其称为其他名称 -

>>> class Foo:
...     b = 20
...     def __init__(them):
...             them.beep = "weee"
... 
>>> f = Foo()
>>> f.beep
'weee'
于 2012-10-10T02:56:06.197 回答