Python 定义类时, 为何该值不是所有实例共享的 ?

查看:61
本文介绍了Python 定义类时, 为何该值不是所有实例共享的 ?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

尝试解决

解决方案

题主通过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_VALUE
Out[5]: 1

In [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 = 2

In [9]: c1.__dict__
Out[9]: {'CLASS_VALUE': 2}

In [10]: c1.__class__.CLASS_VALUE
Out[10]: 1

In [11]: c2.CLASS_VALUE
Out[11]: 1

In [12]: C.CLASS_VALUE = 10

In [13]: c1.__class__.CLASS_VALUE
Out[13]: 10

In [14]: c2.CLASS_VALUE
Out[14]: 10

In [15]: c2.__class__.CLASS_VALUE
Out[15]: 10

这篇关于Python 定义类时, 为何该值不是所有实例共享的 ?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆