python中的静态实例变量

时间:2016-06-01 08:30:14

标签: python

我试图了解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中都这样做,但结果是一样的。 我认为我对这个概念的理解是错误的。

有人可以向我解释一下或引导我找一个资源。

2 个答案:

答案 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创建值对象