Sök…


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

Grundläggande attributstillträde med Dot Notation

Låt oss ta en provklass.

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

book1 = Book(title="Right Ho, Jeeves", author="P.G. Wodehouse")

I Python kan du komma åt attribut titeln klassen med punktnotation.

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

Om ett attribut inte finns, kastar Python ett fel:

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

Setters, Getters & Properties

För datakapsling vill du ibland ha ett attribut som värdet kommer från andra attribut eller i allmänhet vilket värde som ska beräknas för tillfället. Det vanliga sättet att hantera denna situation är att skapa en metod, kallad getter eller en setter.

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

I exemplet ovan är det lätt att se vad som händer om vi skapar en ny bok som innehåller en titel och en författare. Om alla böcker vi ska lägga till i vårt bibliotek har författare och titlar, kan vi hoppa över bokstäverna och placera och använda punktnotationen. Anta dock att vi har några böcker som inte har en författare och vi vill ställa författaren till "Okänd". Eller om de har flera författare och vi planerar att returnera en lista med författare.

I det här fallet kan vi skapa en getter och en setter för författareattributet .

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

Detta schema rekommenderas inte.

En anledning är att det finns en fångst: Låt oss anta att vi har utformat vår klass med det allmänna attributet och inga metoder. Människor har redan använt det mycket och de har skrivit kod som det här:

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

Nu har vi ett problem. Eftersom författare inte är ett attribut! Python erbjuder en lösning på detta problem som kallas egenskaper. En metod för att få egenskaper är dekorerad med @property innan dess rubrik. Metoden som vi vill fungera som en setter är dekorerad med @ attributeName.setter innan den.

Med detta i åtanke har vi nu vår nya uppdaterade klass.

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

Observera att Python normalt inte tillåter dig att ha flera metoder med samma namn och olika antal parametrar. Men i detta fall tillåter Python detta på grund av de dekoratörer som används.

Om vi testar koden:

>>> 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow