Python Language
Accesso agli attributi
Ricerca…
Sintassi
-
x.title # Accesses the title attribute using the dot notation
-
x.title = "Hello World" # Sets the property of the title attribute using the dot notation
-
@property # Used as a decorator before the getter method for properties
-
@title.setter # Used as a decorator before the setter method for properties
Accesso di base agli attributi usando la notazione dot
Prendiamo una lezione di esempio.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
book1 = Book(title="Right Ho, Jeeves", author="P.G. Wodehouse")
In Python puoi accedere al titolo dell'attributo della classe usando la notazione dot.
>>> book1.title
'P.G. Wodehouse'
Se un attributo non esiste, Python genera un errore:
>>> book1.series
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Book' object has no attribute 'series'
Setter, Getters e Proprietà
Per motivi di incapsulamento dei dati, a volte si desidera avere un attributo il cui valore deriva da altri attributi o, in generale, quale valore deve essere calcolato al momento. Il modo standard per affrontare questa situazione è creare un metodo, chiamato getter o setter.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
Nell'esempio sopra, è facile vedere cosa succede se creiamo un nuovo libro che contiene un titolo e un autore. Se tutti i libri che dobbiamo aggiungere alla nostra libreria hanno autori e titoli, possiamo saltare i getter e setter e usare la notazione dot. Tuttavia, supponiamo di avere alcuni libri che non hanno un autore e vogliamo impostare l'autore su "Sconosciuto". O se hanno più autori e abbiamo in programma di restituire una lista di autori.
In questo caso possiamo creare un getter e un setter per l'attributo author .
class P:
def __init__(self,title,author):
self.title = title
self.setAuthor(author)
def get_author(self):
return self.author
def set_author(self, author):
if not author:
self.author = "Unknown"
else:
self.author = author
Questo schema non è raccomandato.
Una ragione è che c'è un problema: supponiamo di aver progettato la nostra classe con l'attributo pubblico e nessun metodo. Le persone lo hanno già usato molto e hanno scritto un codice come questo:
>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = "" #Cos Some Guy didn't write this one!
Ora abbiamo un problema Perché l' autore non è un attributo! Python offre una soluzione a questo problema chiamato proprietà. Un metodo per ottenere le proprietà è decorato con @property prima della sua intestazione. Il metodo che vogliamo funzionare come setter è decorato con @ attributeName.setter prima di esso.
Tenendo presente questo, ora abbiamo la nostra nuova classe aggiornata.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
@property
def author(self):
return self.__author
@author.setter
def author(self, author):
if not author:
self.author = "Unknown"
else:
self.author = author
Nota, normalmente Python non ti permette di avere più metodi con lo stesso nome e un numero diverso di parametri. Tuttavia, in questo caso, Python lo consente a causa dei decoratori utilizzati.
Se testiamo il codice:
>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = "" #Cos Some Guy didn't write this one!
>>> book.author
Unknown