2009-12-16 8 views
3

Un descripteur python avec lequel je travaille partage sa valeur sur toutes les instances de sa classe propriétaire. Comment puis-je faire en sorte que le descripteur de chaque instance contienne ses propres valeurs internes?descripteurs python partageant des valeurs entre classes

class Desc(object): 
    def __init__(self, initval=None,name='val'): 
     self.val = initval 
     self.name = name 

    def __get__(self,obj,objtype): 
     return self.val 

    def __set__(self,obj,val): 
     self.val = val 

    def __delete__(self,obj): 
     pass 


class MyClass(object): 
    desc = Desc(10,'varx') 

if __name__ == "__main__": 
    c = MyClass() 
    c.desc = 'max' 
    d = MyClass() 
    d.desc = 'sally' 

    print(c.desc) 
    print(d.desc) 

La sortie est cela, le dernier appel mis la valeur pour les deux objets:

localhost $ python descriptor_testing.py 
sally 
sally 

Répondre

7

Il n'y a qu'un seul objet descripteur, stocké sur l'objet de classe, de sorte self est toujours le même. Si vous souhaitez stocker des données par objet et y accéder via le descripteur, vous devez soit stocker les données sur chaque objet (probablement la meilleure idée), soit dans une structure de données codée par chaque objet (une idée que je n'aime pas autant).

J'enregistrer des données sur l'objet de l'instance:

Dans ce cas, les données seront stockées dans la saisie des varX ' « s de obj dans son __dict__. En raison de la façon dont recherche de descripteurs de données fonctionne bien, vous pouvez « ombre » l'emplacement de stockage avec le descripteur:

class MyClass(object): 
    varx = Desc('varx') 

Dans ce cas, lorsque vous faites la recherche:

MyClass().varx 

L'objet descripteur est appelé et peut faire sa recherche, mais lorsque la recherche va comme ceci:

MyClass().__dict__['varx'] 

la valeur est renvoyée directement. Ainsi, le descripteur est capable de stocker ses données dans un endroit «caché», pour ainsi dire.

+1

Je pense qu'une partie du problème est qu'il y a un exemple sur python.org qui est fondamentalement faux pour la même raison. C'est l'exemple de descripteur dans http://docs.python.org/howto/descriptor.html et c'est le premier résultat pour googler des descripteurs python. – damix911

Questions connexes