2010-09-18 4 views
0

Basé sur a question I previously asked, j'ai essayé de trouver une propriété de classe qui permettrait de régler et d'obtenir. semblePourquoi cette implémentation classprop ne fonctionne-t-elle pas?

class classprop(object): 
    def __init__(self, fget, fset=None): 
     if isinstance(fget, classmethod): 
      self.fget = fget 
     else: 
      self.fget = classmethod(fget) 
     if not fset or isinstance(fset, classmethod): 
      self.fset = fset 
     else: 
      self.fset = classmethod(fset) 
    def __get__(self, *a): 
     return self.fget.__get__(*a)() 
    def __set__(self, cls, value): 
     print 'In __set__' 
     if not self.fset: 
      raise AttributeError, "can't set attribute" 
     fset = self.fset.__get__(cls) 
     fset(value) 

class X(object): 
    @classmethod 
    def _get_x(cls): 
     return 1 
    @classmethod 
    def _set_x(cls, value): 
     print 'You set x to {0}'.format(value) 
    x = classprop(fget=_get_x, fset=_set_x) 

Tout en obtenant fonctionne, le réglage ne doit pas être se disant:: Alors je l'ai écrit cela et le mettre dans un module util

>>> util.X.x 
1 
>>> util.X.x = 1 
>>> 

Qu'est-ce que je fais mal?

(Et je l'ai vu les mises en œuvre de ce qui fonctionnent un peu différemment. Je suis particulièrement vouloir savoir pourquoi cette mise en œuvre ne fonctionne pas.)

Répondre

0

The doc's say:

object.__set__(self, instance, value) Appelés à définir l'attribut sur une instance instance du propriétaire classe à une nouvelle valeur, valeur.

Contrairement à __get__, il ne mentionne pas attributs de classe. Donc, Python n'appellera pas __set__ sur un attribut de classe.

+0

Pourquoi "X" ne serait-il pas l'instance et 'type' la classe? –

+0

Les instances et les types sont différents et ainsi leur écrit. Python n'implémente pas les descripteurs comme vous le souhaitez. –

Questions connexes