Puoi usare @property
annotazioni per implementare getter e setter à la Java o Ruby. Questi forniscono una qualche forma di incapsulamento pur consentendo agli utenti della tua classe di accedere agli attributi in modo Python.
Supponiamo che tu abbia una classe con un attributo name
rivolto al pubblico, ma i nomi devono essere sotto una certa lunghezza.
class Foo(object):
def __init__(self, name: str):
if len(name) <= 3:
self.name = name
else:
raise TypeError
In questo caso, la lunghezza del valore name
viene verificata all'istanziazione ma non da allora in poi; potresti usare un _name
attributo e un brutto get_name()
e set_name()
metodi, ma usando @property
annotazioni come sotto, puoi fare un controllo di validità per l'attributo ogni volta che viene impostato mentre ancora lo si consente di accedervi nel Python convenzionale modo, cioè per mezzo di espressioni come foo.name
e foo.name = 'xyz'
.
class Foo(object):
def __init__(self, name: str):
self.name = name
@property
def name(self):
return self._name
@name.setter
def name(self, new_name: str):
if len(new_name) <= 3:
self._name = new_name
else:
raise TypeError
Come menzionato da Idan, _
-prefixing di metodi / attributi privati è solo una convenzione (seguita con molta attenzione) e un utente potrebbe ancora manipolare il valore dell'attributo se lo desiderava davvero, ad es. di foo._name = 'abcdef'
.