Ho una classe che contiene un oggetto (impostato in questo caso). Il set è modificato dagli operatori di funzione standard __add__
e __sub__
, ma voglio anche esporre esplicitamente un metodo per ottenere questo set.
Dovresti usare% decoratore @property
invece di un semplice metodo get()
, anche se non c'è intenzione di consentire l'impostazione o l'eliminazione?
Ad esempio:
class A(object):
def __init__(self):
self.attribute = set()
def __add__(self, other):
self.attribute.add(other)
return self
def __sub__(self, other):
self.attribute.remove(other)
return self
@property
def stuff(self):
return self.attribute
Sembra semanticamente corretto utilizzare una proprietà e vengono sollevati i giusti messaggi di errore se un tentativo di impostare o eliminare la proprietà si verifica AttributeError: can't set attribute
. Ma sembra anche un po 'una truffa per i potenziali utenti che, sapendo che esiste una proprietà, possono aspettarsi che il resto del contratto (impostazione ed eliminazione) sia soddisfatto.
Un'altra opzione potrebbe essere quella di definire il setter / deleter in termini di __add__
e __sub__
ma questa sembra una violazione meno evidente dello stesso contratto.
@stuff.setter
def stuff(self, other):
self.__add__(other)