在Python类中,使用self语法创建变量和创建没有变量的变量有什么区别?

Zac*_*ack -1 python

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

我正在测试它,我仍然可以从一个实例访问它们:

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

if __name__ == '__main__':
    testInstance = TestClass()
    print testInstance.i
    print testInstance.j
Run Code Online (Sandbox Code Playgroud)

但是,如果我交换了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
Run Code Online (Sandbox Code Playgroud)

所以我认为自我在初始化中有一个特殊的作用..但是,我只是不太明白它是什么.

Amb*_*ber 6

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

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

class Foo(object):
    a = 1

one = Foo()
two = Foo()

Foo.a = 3
Run Code Online (Sandbox Code Playgroud)

由于此值是类范围的,因此您不仅可以直接从类中读取它:

print Foo.a # prints 3
Run Code Online (Sandbox Code Playgroud)

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

print one.a # prints 3
print two.a # prints 3
Run Code Online (Sandbox Code Playgroud)

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

class Bar(object)
    a = 1
    def __init__(self):
        self.a = 2
Run Code Online (Sandbox Code Playgroud)

然后做了以下事情:

one = Bar()
two = Bar()
two.a = 3
Run Code Online (Sandbox Code Playgroud)

然后你会得到以下结果:

print Bar.a # prints "1"
print one.a # prints "2"
print two.a # prints "3"
Run Code Online (Sandbox Code Playgroud)

如注释中所述,指定在two.a该实例上创建一个实例本地条目,它会覆盖afrom Bar,因此为什么Bar.a仍然是1但是two.a为3.