Python3 来定义类时, 为何该值不是所有实例共享呢 ?,python3类时,2017/1/19描述详


2017/1/19

描述

详见代码, Python中, 是否有「所有实例共享的值」这种东西?

相关代码

定义类

                                          In [1]: class C(object):                     ...:     CLASS_VALUE = 1                  ...:                                                                             In [2]: c1 = C()                                                                    In [3]: c2 = C()                                                                    In [4]: c1.CLASS_VALUE, c2.CLASS_VALUE    Out[4]: (1, 1)                                                                      In [5]: c2.CLASS_VALUE = 2                                                          In [6]: c1.CLASS_VALUE, c2.CLASS_VALUE    Out[6]: (1, 2)                            

上下文环境

产品版本:Python2.7.x

操作系统: Linux

尝试解决

In [15]: class C:    ...:     var = 1    ...:     In [16]: c1 = C()In [17]: c2 = C()In [18]: c1.varOut[18]: 1In [19]: c2.varOut[19]: 1In [20]: C.var = 2In [21]: c1.varOut[21]: 2In [22]: c2.varOut[22]: 2In [23]: c2.var = 3In [24]: c2.varOut[24]: 3In [25]: c1.varOut[25]: 2

Python3

__class__

>>> class C(object):    v=1    >>> c1=C()>>> c2=C()>>> c1.v,c2.v(1, 1)>>> c2.v=2>>> c1.v,c2.v(1, 2)>>> c2.__class__<class '__main__.C'>>>> c2.__class__.v1>>> c1.__class__.v1>>> c2.__class__.v=99>>> c1.__class__.v99>>> 

可以借助一个辅助单例模式的类

class Attr():    attr = {}    def __init__(self):        self.__dict__ = self.attrclass Myclass():    def __init__(self):        self.attr = Attr()    @property    def value(self):        return self.attr.value    @value.setter    def value(self, value):        self.attr.value = value

然后所有的Myclass实例共享一个attr,就有类似的效果。

                                  In [47]: a = Myclass()                                              In [48]: b = Myclass()                                              In [49]: a.value = 1                                                In [50]: b.value                  Out[50]: 1                                                          In [51]: b.value = 2                                                In [52]: a.value, b.value         Out[52]: (2, 2)                   

题主通过c2.CLASS_VALUE = 2赋值的时候实际上是动态的给实例对象c2增加了CLASS_VALUE这个实例属性
所以打印c2.CLASS_VALUE的时候会访问到刚刚动态创建的实例属性。通过打印__dict__就可以看到
而类属性没有改变,通过c1.__class__.CLASS_VALUE还是c2.__class__.CLASS_VALUE都是一样的。想改变类属性的值可以通过类来改变C.CLASS_VALUE = value

In [2]: class C(object):   ...:     CLASS_VALUE = 1   ...:     In [3]: In [3]: c1 = C()In [4]: c2 = C()In [5]: c1.CLASS_VALUEOut[5]: 1In [6]: c1.__dict__Out[6]: {}In [7]: C.__dict__Out[7]: dict_proxy({'CLASS_VALUE': 1,            '__dict__': <attribute '__dict__' of 'C' objects>,            '__doc__': None,            '__module__': '__main__',            '__weakref__': <attribute '__weakref__' of 'C' objects>})In [8]: c1.CLASS_VALUE = 2In [9]: c1.__dict__Out[9]: {'CLASS_VALUE': 2}In [10]: c1.__class__.CLASS_VALUEOut[10]: 1In [11]: c2.CLASS_VALUEOut[11]: 1In [12]: C.CLASS_VALUE = 10In [13]: c1.__class__.CLASS_VALUEOut[13]: 10In [14]: c2.CLASS_VALUEOut[14]: 10In [15]: c2.__class__.CLASS_VALUEOut[15]: 10

编橙之家文章,

评论关闭