在Python中,如果我定义一个变量:
my_var = (1,2,3)
并尝试在类的__init__
函数中访问它:
class MyClass:
def __init__(self):
print my_var
我可以访问它并打印my_var
而不说明(全局my_var)。
如果我在my_var
之后立即class MyClass
,我会收到范围错误(no global variable found)
。
这是什么原因?我该怎么做?我在哪里可以阅读这个来学习?我确实读过Python类页面,但我没有遇到它的解释。
谢谢
答案 0 :(得分:11)
补充@ 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 :)
答案 1 :(得分:9)
当你在class MyClass
之后把它放好后,它就会变成一个类属性,你可以通过MyClass.my_var
或self.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
答案 2 :(得分:2)
如果你写:
class MyClass(object):
my_var = (1, 2, 3)
您正在定义MyClass
的属性,而不是变量。在__init__
方法中,它是MyClass.my_var
。
答案 3 :(得分:1)
一旦它在class
定义中,它就不再是全局的,它现在位于类对象的命名空间中。您可以在self.my_var
__init__
内使用{{1}}访问它,但是......