Python3 来定义类时, 为何该值不是所有实例共享呢 ?,python3类时,2017/1/19描述详
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
编橙之家文章,
相关内容
- git能向远程仓库Pull,不能向远程仓库push的问题?,git
- Python 标准操作符与逻辑运算符,python操作符,python同大
- Python程序调试的概念,python调试概念,基本上初学者在网
- Python 字符串是什么及简单操作方法,python字符串,pyth
- Python print语句不换行、换行函数语句操作方法,python
- Python dir()内置函数作用及使用方法,pythondir,Python内置的
- Python基础知识之专用术语讲解,python基础知识术语,在学
- Python help函数命令怎么使用,pythonhelp函数命令,help函数
- Python的数据类型转换函数,python数据类型,编橙之家这篇
- Python基本内置数据类型有哪些?,python内置数据类型
评论关闭