Hier is een zuiver Python-specifieke ontwerpvraag:
class MyClass(object):
...
def get_my_attr(self):
...
def set_my_attr(self, value):
...
en
class MyClass(object):
...
@property
def my_attr(self):
...
@my_attr.setter
def my_attr(self, value):
...
Python laat ons toe om het op beide manieren te doen. Als jij een Python programma zou ontwerpen, welke aanpak zou je dan gebruiken en waarom?
Door eigenschappen te gebruiken kun je beginnen met normale attribuut-toegangen en ze dan ondersteunen met getters en setters achteraf als dat nodig is.
Het korte antwoord is: **Eigenschappen winnen het altijd. Altijd.
Er is soms behoefte aan getters en setters, maar zelfs dan zou ik "hide" ze voor de buitenwereld. Er zijn genoeg manieren om dit in Python te doen (getattr
, setattr
, __getattribute__
, etc..., maar een hele beknopte en schone is:
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)
Hier's een kort artikel dat het onderwerp van getters en setters in Python introduceert.
Het gebruik van eigenschappen is voor mij intuïtiever en past beter in de meeste code.
Vergelijking van
o.x = 5
ox = o.x
vs.
o.setX(5)
ox = o.getX()
is voor mij vrij duidelijk wat gemakkelijker te lezen is. Ook properties maakt het veel makkelijker om private variabelen te gebruiken.