2017-09-19 5 views
-2

J'essaie d'utiliser des décorateurs de propriétés et d'effectuer des opérations de base tout en obtenant cette erreur ainsi que face à un problème avec deleter et ne pas obtenir la sortie attendue du code.La propriété deleter ne fonctionne pas

class Numbers(object): 
    Multiplier = 4 
    def __init__(self, x, y): 
      self._x = x 
      self._y = y 

    def add(self): 
     return self._x + self._y 

    @classmethod 
    def multiply(cls, a): 
     return a*cls.Multiplier 

    @staticmethod 
    def subtract(b,c): 
     return b-c 

    @property 
    def values(self): 
     return "(%d,%d)" % (self._x, self._y) 

    @values.setter 
    def values(self, value1, value2): 
     self._x = value1 
     self._y = value2 

    @values.deleter 
    def values(self): 
     print('deleting') 
     del self._x 
     del self._y 

val = Numbers(2,4) 

print(val.values) 
print(val._x) 
print(val._y) 
print(val.multiply(5)) 
print(val.subtract(8,2)) 
print(val.add()) 
val.values = (34,45) 
print(val.values) 
del (val.values) 
print(val.values) 
+1

Le problème est avec le setter * *, sûrement? Il devrait prendre un seul argument, le deux-tuple des valeurs x et y. Par exemple. vous pourriez faire le setter 'def values ​​(self, (value1, value2)):', bien que ce ne soit pas compatible avec Python 3.x. Mais notez que vous devriez donner un [mcve], pas seulement * "obtenir une erreur et faire face à un problème" *. – jonrsharpe

+0

Merci pour le conseil. le code édité et a toujours l'erreur "AttributeError: l'objet 'Numbers' n'a pas d'attribut '_x'" @jonrsharpe –

+2

C'est ce qui est censé arriver, qu'attendiez-vous lorsque vous avez accédé à l'attribut après l'avoir explicitement supprimé? – jonrsharpe

Répondre

1

Il ya 2 problèmes avec votre code. Le suppresseur supprime réellement les variables des attributs comme on pourrait s'y attendre, mais ce n'est pas ce que vous voulez probablement puisque vous essayez de les afficher après la suppression. Donc, au lieu de supprimer réellement les variables, vous voudrez peut-être les remplacer par 0 ou None à la place.

@values.deleter 
def values(self): 
    print('deleting') 
    self._x = None 
    self._y = None 

Une autre option qui pourrait rendre votre code plus simple est de ne pas utiliser le mot-clé del mais plutôt faire une fonction « claire » et utiliser comme val.clear()

La deuxième question est la fonction setter puisqu'il est attendre 2 variables mais cela ne peut pas être fait avec l'expression val.values = something. Je vous conseille d'utiliser le format suivant:

@values.setter 
def values(self, values): 
    value1, value2 = values 
    self._x = value1 
    self._y = value2 

Et vous stockerait les valeurs comme ceci:

val.values = (3, 5)