Suche…


Syntax

  • 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

Grundlegender Attributzugriff mit der Punktnotation

Nehmen wir eine Probestunde.

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 können Sie das Attribut Titel der Klasse Zugriff auf die Punktnotation verwendet.

>>> book1.title 
'P.G. Wodehouse'

Wenn ein Attribut nicht vorhanden ist, gibt Python einen Fehler aus:

>>> book1.series
Traceback  (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Book' object has no attribute 'series'

Setter, Getter & Eigenschaften

Für die Datenkapselung möchten Sie manchmal ein Attribut haben, dessen Wert von anderen Attributen stammt oder generell, welcher Wert momentan berechnet werden soll. Die Standardmethode, um mit dieser Situation umzugehen, ist das Erstellen einer Methode, Getter oder Setter genannt.

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

Im obigen Beispiel ist es leicht zu sehen, was passiert, wenn wir ein neues Buch erstellen, das einen Titel und einen Autor enthält. Wenn alle Bücher, die wir unserer Bibliothek hinzufügen, über Autoren und Titel verfügen, können wir die Getter und Setter überspringen und die Punktnotation verwenden. Angenommen, wir haben einige Bücher, die keinen Autor haben, und wir möchten den Autor auf "Unbekannt" setzen. Oder wenn sie mehrere Autoren haben und wir planen, eine Liste der Autoren zurückzugeben.

In diesem Fall können wir einen Getter und einen Setter für das Author- Attribut erstellen.

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

Dieses Schema wird nicht empfohlen.

Ein Grund ist, dass es einen Haken gibt: Nehmen wir an, wir haben unsere Klasse mit dem Attribut public und ohne Methoden entworfen. Die Leute haben es schon oft benutzt und Code wie folgt geschrieben:

>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = ""  #Cos Some Guy didn't write this one!

Jetzt haben wir ein Problem. Weil Autor kein Attribut ist! Python bietet eine Lösung für dieses Problem, die als Eigenschaften bezeichnet wird. Eine Methode zum Abrufen von Eigenschaften wird mit der @ -Eigenschaft vor dem Header versehen. Die Methode, die wir als Setter verwenden möchten, ist mit @ attributeName.setter davor versehen.

Deshalb haben wir jetzt unsere neue aktualisierte Klasse.

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

Beachten Sie, dass in Python normalerweise nicht mehrere Methoden mit demselben Namen und einer unterschiedlichen Anzahl von Parametern vorhanden sind. In diesem Fall erlaubt Python dies jedoch aufgrund der verwendeten Dekorateure.

Wenn wir den Code testen:

>>> 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow