Python 定义类时, 为何该值不是所有实例共享的 ?
怪我咯
怪我咯 2017-04-18 10:15:36
0
4
427

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

尝试解决

怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(4)
大家讲道理

Lorsque le sujet a attribué une valeur via c2.CLASS_VALUE = 2, il a en fait ajouté dynamiquement l'attribut d'instance CLASS_VALUE à l'objet d'instance c2
Ainsi, lors de l'impression de c2.CLASS_VALUE, l'attribut d'instance qui vient d'être créé dynamiquement sera accessible. Vous pouvez voir
en imprimant __dict__ mais l'attribut de classe n'a pas changé, que ce soit c1.__class__.CLASS_VALUE ou c2.__class__.CLASS_VALUE, c'est pareil. Si vous souhaitez modifier la valeur d'un attribut de classe, vous pouvez la modifier via la classe 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
PHPzhong

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__.v
1
>>> c1.__class__.v
1
>>> c2.__class__.v=99
>>> c1.__class__.v
99
>>> 
阿神

Vous pouvez utiliser une classe qui assiste le modèle singleton

class Attr():
    attr = {}
    def __init__(self):
        self.__dict__ = self.attr
class 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

Ensuite, toutes les instances Myclass partagent un attr, ce qui aura un effet similaire.

                                  
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)                   
Peter_Zhu
  • Les propriétés d'une classe sont partagées par toutes les instances de la classe

  • Lorsqu'une instance de classe modifie un attribut de classe, une "copie en écriture" se produit

In [15]: class C:
    ...:     var = 1
    ...:     

In [16]: c1 = C()

In [17]: c2 = C()

In [18]: c1.var
Out[18]: 1

In [19]: c2.var
Out[19]: 1

In [20]: C.var = 2

In [21]: c1.var
Out[21]: 2

In [22]: c2.var
Out[22]: 2

In [23]: c2.var = 3

In [24]: c2.var
Out[24]: 3

In [25]: c1.var
Out[25]: 2
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!