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 


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow