2010-07-21 9 views
2

En supposant que vous savez sur Python propriété builtin: http://docs.python.org/library/functions.html#propertyEn utilisant la propriété Python() dans une méthode

Je veux re-définir une propriété d'objet de cette façon, mais je dois le faire à l'intérieur d'une méthode pour pouvoir lui passer quelques arguments, actuellement tous les exemples Web de propriété() définissent la propriété en dehors des méthodes, et d'essayer de l'évidence ...

def alpha(self, beta): 
    self.x = property(beta) 

... ne semble pas travailler, je suis heureux si vous pouvez me montrer mon erreur de concept ou d'autres solutions alternatives sans sous-classer le code (en fait mon code est déjà sur-sous-classé) ou en utilisant des décorateurs (c'est la solution que je vais utiliser si il n'y a pas d'autre).

Merci.

+2

Qu'est-ce que vous essayez de faire? Qu'est-ce que 'alpha',' beta' et 'x'? – kennytm

Répondre

4

Propriétés de travail en utilisant le protocole descripteur , qui ne fonctionne que sur les attributs d'un objet de classe . L'objet de propriété doit être stocké dans un attribut de classe. Vous ne pouvez pas le "remplacer" par instance.

Vous pouvez, bien sûr, fournir une propriété sur la classe qui obtient un attribut d'instance ou retombe à une valeur par défaut:

class C(object): 
    _default_x = 5 
    _x = None 
    @property 
    def x(self): 
     return self._x or self._default_x 
    def alpha(self, beta): 
     self._x = beta 
1

Dans ce cas, tout ce que vous devez faire dans votre alpha() est self.x = beta. Utilisez la propriété lorsque vous souhaitez implémenter accesseurs pour un attribut, par exemple:

class Foo(object): 
    @property 
    def foo(self): 
     return self._dblookup('foo') 

    @foo.setter 
    def foo(self, value): 
     self._dbwrite('foo', value) 

Et puis être en mesure de faire

f = Foo() 
f.foo 
f.foo = bar