我试图了解python中的静态变量。根据{{3}}回答,这段代码应该使i
对于类Test
的所有对象都是唯一的
代码:
>>> class Test(object):
... _i = 3
... @property
... def i(self):
... return self._i
... @i.setter
... def i(self,val):
... self._i = val
...
>>>
>>> x1 = Test()
>>> x1.i
3
>>> x2 = Test()
>>> x2.i
3
>>> x1.i = 10
>>> x1.i
10
>>> x2.i
3
但是你可以看到对象x1.i不等于x2.i.
我尝试在python 2.7和3.4中都这样做,但结果是一样的。
我认为我对这个概念的理解是错误的。
有人可以向我解释一下或引导我找一个资源。
答案 0 :(得分:1)
如上所述,linked answer错了。
class Test(object):
i = 0
t = Test()
t.i = 4
print t.i
>>> 4
print t.__class__.i
>>> 0
在实例上找不到class
上声明的字段,但您无法通过self
直接修改该类。 self.i = 4
始终修改实例。你可以做像
class Test(object):
_i = 0
@property
def i(self):
return self._i
@i.setter
def i(self, value):
Test._i = value
但是在整个地方复制类名似乎不是一个好主意,并且self.__class__
在继承方面不能很好地发挥作用。这也完全隐藏了这样一个事实:i
最初是一个类变量,可能也可能不是一个好主意。
答案 1 :(得分:0)
class Test(object):
_i = 3
@property
def i(self):
return self._i
@i.setter
def i(self,val):
self._i = val
if __name__ == '__main__':
x1 = Test()
x2 = Test()
x1.i = 10
print(x1.__dict__)
print(Test.__dict__)
{'_i': 10}
{'i': <property object at 0x02551180>, '__weakref__': <attribute '__weakref__' of 'Test' objects>, '_i': 3, '__module__': '__main__', '__doc__': None, '__dict__': <attribute '__dict__' of 'Test' objects>}
x1.i = 10创建值对象