假设我在不同场景中有2个班级.
场景1
class MyClass():
temp = 5
Run Code Online (Sandbox Code Playgroud)
情景2
class MyClass():
temp = 5
def myfunc(self):
print self.temp
Run Code Online (Sandbox Code Playgroud)
现在什么时候将变量temp视为类变量和实例变量.我很困惑,因为在这两种情况下我都可以temp使用两者来访问变量的值.
Object.Temp (表现为实例变量)
ClassName.Temp (表现为类变量)
我相信之前已经提出了类似的问题,但如果有人能够在我的问题的背景下解释这个问题,这将是一个很大的帮助.
类变量在类的所有实例之间共享.对于不可变类型(如int,str,...),你不会注意到很多不同之处.但考虑一下:
class MyClass():
temp = []
def myfunc(self, val):
self.temp.append(val)
print self.temp
instance1 = MyClass()
instance1.myfunc(1) # [1]
instance2 = MyClass()
instance2.myfunc(2) # [1, 2]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,两个实例共享相同的列表,即如果实例本身没有temp成员,则使用该类的实例.
所以,如果你进一步做:
MyClass.temp.append(3)
print instance1.temp # [1, 2, 3]
instance1.temp = []
print instance1.temp # [] uses the instances temp
print instance2.temp # [1, 2, 3]
del instance1.temp
print instance1.temp # [1, 2, 3] uses the class' temp again
Run Code Online (Sandbox Code Playgroud)
基本上,MyClass.temp始终是一个类变量.获取obj.temp返回类变量,直到您尝试设置obj.temp,这将创建一个掩盖类变量的成员变量.我希望这有帮助:
>>> class MyClass(object):
... temp = 5
...
>>> a = MyClass()
>>> b = MyClass()
>>> a.temp
5
>>> b.temp
5
>>> b.temp = 6
>>> a.temp
5
>>> MyClass.temp = 7
>>> a.temp
7
>>> b.temp
6
>>> a.__dict__
{}
>>> b.__dict__
{'temp': 6}
>>> MyClass.__dict__
{..., 'temp': 7}
Run Code Online (Sandbox Code Playgroud)
编辑:正如mata所说,调用方法(例如append())obj.temp不会算作"设置"它.