Python变量范围和类

Phi*_*hil 6 python python-2.7

在Python中,如果我定义一个变量:

my_var = (1,2,3)
Run Code Online (Sandbox Code Playgroud)

并尝试在__init__类的功能中访问它:

class MyClass:
    def __init__(self):
        print my_var
Run Code Online (Sandbox Code Playgroud)

我可以访问它并打印my_var而不说明(全局my_var).

但是如果我把它放在my_var后面class MyClass,我会得到范围错误(no global variable found).

这是什么原因?我该怎么做?我在哪里可以阅读这个来学习?我确实读过Python类页面,但我没有遇到它的解释.

谢谢

Zau*_*bov 12

补充@ mgilson的答案:请注意,Python类变量在类实例之间共享.这种行为可能非常意外,看起来很奇怪.在实践中它的工作方式如下:

class MyClass(object):
    my_var = 10

    def __init__(self):
        print(self.my_var)


m1 = MyClass()
print(m1.my_var)
>>> 10          # this is fine

MyClass.my_var = 20
print(m1.my_var)
>>> 20          # WTF? :) --> shared value

m2 = MyClass()
print(m2.my_var)
>>> 20          # this is expected

m1.my_var = 30
print(MyClass.my_var)
>>> 20          # this is also expected

MyClass.my_var = 40 
print(m1.my_var)
>>> 30           # But WHY? Isn't it shared? --> 
                 # The value WAS shared until m1.my_var = 30 has happened.

print(m2.my_var)
>>> 40           # yep m2.my_var's value is still shared :)
Run Code Online (Sandbox Code Playgroud)


mgi*_*son 10

当你把它放在后面时class MyClass,它就变成了一个类属性,你可以通过类MyClass.my_varself.my_var从类中获取它(如果你没有创建一个具有相同名称的实例变量).

这是一个小小的演示:

my_var = 'global'
class MyClass(object):
   my_var = 'class' 
   def __init__(self):
      print my_var #global
      print MyClass.my_var #class
      print self.my_var #class -- Only since we haven't set this attribute on the instance
      self.my_var = 'instance' #set instance attribute.
      print self.my_var #instance
      print MyClass.my_var #class
Run Code Online (Sandbox Code Playgroud)