Python Language
Attribuut Toegang
Zoeken…
Syntaxis
-
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
Basiskenmerktoegang met behulp van de puntnotatie
Laten we een voorbeeldles nemen.
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 u toegang tot het attribuut titel van de klas met behulp van de dot-notatie.
>>> book1.title
'P.G. Wodehouse'
Als een kenmerk niet bestaat, geeft Python een foutmelding:
>>> book1.series
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Book' object has no attribute 'series'
Setters, Getters & eigenschappen
Omwille van de inkapseling van gegevens wilt u soms een attribuut waarvan de waarde afkomstig is van andere attributen of, in het algemeen, welke waarde op dit moment zal worden berekend. De standaardmanier om met deze situatie om te gaan, is een methode te maken, getter of een setter genoemd.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
In het bovenstaande voorbeeld is het gemakkelijk om te zien wat er gebeurt als we een nieuw boek maken met een titel en een auteur. Als alle boeken die we aan onze bibliotheek willen toevoegen auteurs en titels hebben, kunnen we de getters en setters overslaan en de puntnotatie gebruiken. Stel dat we enkele boeken hebben die geen auteur hebben en we willen de auteur instellen op 'Onbekend'. Of als ze meerdere auteurs hebben en we zijn van plan om een lijst met auteurs terug te sturen.
In dit geval kunnen we een getter en een setter maken voor het auteurskenmerk .
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
Dit schema wordt niet aanbevolen.
Een reden is dat er een addertje onder het gras zit: laten we aannemen dat we onze klasse hebben ontworpen met het kenmerk public en zonder methoden. Mensen hebben het al veel gebruikt en ze hebben code zoals deze geschreven:
>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = "" #Cos Some Guy didn't write this one!
Nu hebben we een probleem. Omdat auteur geen attribuut is! Python biedt een oplossing voor dit probleem genaamd eigenschappen. Een methode om eigenschappen te krijgen is versierd met de @property vóór de koptekst. De methode die we willen gebruiken als een setter is versierd met @ attributeName.setter ervoor.
Met dit in gedachten hebben we nu onze nieuwe bijgewerkte 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
Merk op dat normaal gesproken Python je niet toestaat om meerdere methoden met dezelfde naam en een ander aantal parameters te hebben. In dit geval staat Python dit echter toe vanwege de gebruikte decorateurs.
Als we de code testen:
>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = "" #Cos Some Guy didn't write this one!
>>> book.author
Unknown