Ecco una domanda di progettazione puramente specifica per Python:
class MyClass(object):
...
def get_my_attr(self):
...
def set_my_attr(self, value):
...
e
class MyClass(object):
...
@property
def my_attr(self):
...
@my_attr.setter
def my_attr(self, value):
...
Python ci permette di farlo in entrambi i modi. Se dovessi progettare un programma Python, quale approccio useresti e perché?
L'uso delle proprietà vi permette di iniziare con i normali accessi agli attributi e poi di sostenerli con getter e setter in seguito, se necessario.
La risposta breve è: le proprietà vincono a mani basse. Sempre.
A volte c'è bisogno di getter e setter, ma anche in quel caso, li nasconderei al mondo esterno. Ci sono molti modi per farlo in Python (getattr
, setattr
, __getattribute__
, ecc..., ma uno molto conciso e pulito è:
def set_email(self, value):
if '@' not in value:
raise Exception("This doesn't look like an email address.")
self._email = value
def get_email(self):
return self._email
email = property(get_email, set_email)
Ecco un breve articolo che introduce l'argomento dei getter e dei setter in Python.
Usare le proprietà è per me più intuitivo e si adatta meglio alla maggior parte del codice.
Confronto tra
o.x = 5
ox = o.x
vs.
o.setX(5)
ox = o.getX()
per me è abbastanza ovvio che è più facile da leggere. Anche le proprietà permettono di avere variabili private molto più facilmente.