7

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

my_var = (1,2,3)

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

class MyClass:
    def __init__(self):
        print my_var

我可以访问它并打印my_var而无需说明(全局 my_var)。

但是,如果我紧随my_var其后class MyClass,我会得到 scope error (no global variable found)

这是什么原因?我该怎么做?我在哪里可以阅读有关此内容的信息?我确实阅读了 Python Class 页面,但没有遇到它的解释。

谢谢

4

4 回答 4

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 :)
于 2012-10-17T19:42:13.730 回答
11

当你把它放在后面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
于 2012-10-17T19:20:17.850 回答
2

如果你写:

class MyClass(object):
    my_var = (1, 2, 3)

您正在定义 的属性MyClass,而不是变量。那么,在您的__init__方法中,它是MyClass.my_var.

于 2012-10-17T19:21:09.600 回答
1

一旦它在class定义中,它就不再是全局的,它现在在类对象的命名空间中。您可以使用 inside 访问self.my_var__init__...

于 2012-10-17T19:20:58.993 回答