Sie können Accessoren/Mutatoren verwenden (z. B. @attr.setter
y @property
) oder nicht, aber das Wichtigste ist konsequent zu sein!
Wenn Sie Folgendes verwenden @property
um einfach auf ein Attribut zuzugreifen, z. B.
class myClass:
def __init__(a):
self._a = a
@property
def a(self):
return self._a
verwenden Sie es für den Zugang zu jeder* zuordnen! Es wäre eine schlechte Praxis, auf einige Attribute mit @property
und lassen einige andere Eigenschaften öffentlich (d.h. Name ohne Unterstrich) ohne einen Accessor, z.B. nicht tun
class myClass:
def __init__(a, b):
self.a = a
self.b = b
@property
def a(self):
return self.a
Beachten Sie, dass self.b
hat hier keinen expliziten Accessor, obwohl er öffentlich ist.
Ähnlich wie bei Einsteller (oder Mutatoren ), können Sie Folgendes verwenden @attribute.setter
pero Sei konsequent! Wenn Sie z.B.
class myClass:
def __init__(a, b):
self.a = a
self.b = b
@a.setter
def a(self, value):
return self.a = value
Es ist schwer für mich, Ihre Absicht zu erraten. Auf der einen Seite sagen Sie, dass beide a
y b
sind öffentlich (kein führender Unterstrich in ihren Namen), so dass ich theoretisch erlaubt sein sollte, auf beide zuzugreifen/zu verändern (get/set). Aber dann geben Sie einen expliziten Mutator nur für a
was mir sagt, dass ich vielleicht nicht in der Lage sein sollte, die b
. Da Sie einen expliziten Mutator bereitgestellt haben, bin ich nicht sicher, ob das Fehlen eines expliziten Accessors ( @property
) bedeutet, dass ich nicht in der Lage sein sollte, auf eine dieser Variablen zuzugreifen, oder Sie waren einfach sparsam bei der Verwendung von @property
.
*Die Ausnahme ist, wenn Sie einige Variablen ausdrücklich zugänglich oder veränderbar machen wollen. aber nicht beides oder Sie möchten beim Zugriff auf ein Attribut oder dessen Änderung eine zusätzliche Logik ausführen. In solchen Fällen verwende ich persönlich @property
y @attribute.setter
(ansonsten keine expliziten Acessoren/Mutatoren für öffentliche Attribute).
Und schließlich die Vorschläge von PEP8 und Google Style Guide:
PEP8, Entwerfen für Vererbung sagt:
Bei einfachen öffentlichen Datenattributen ist es Am besten ist es, nur den Namen des Attributs anzugeben, ohne komplizierte Accessor/Mutator-Methoden . Denken Sie daran, dass Python einen einfachen Weg für zukünftige Erweiterungen bietet, wenn Sie feststellen, dass ein einfaches Datenattribut funktionales Verhalten entwickeln muss. Verwenden Sie in diesem Fall Eigenschaften, um die funktionale Implementierung hinter einer einfachen Syntax für den Zugriff auf Datenattribute zu verbergen.
Andererseits, laut Google Style Guide Regeln/Eigenschaften der Python-Sprache die Empfehlung lautet::
Verwenden Sie Eigenschaften in neuem Code, um auf Daten zuzugreifen oder diese zu setzen, wo Sie normalerweise einfache, leichtgewichtige Accessor- oder Setter-Methoden verwendet hätten. Eigenschaften sollten mit der @property
Dekorateur.
Die Vorteile dieses Ansatzes:
Die Lesbarkeit wird durch den Wegfall expliziter get- und set-Methodenaufrufe für den einfachen Attributzugriff verbessert. Ermöglicht faule Berechnungen. Gilt als der pythonische Weg, die Schnittstelle einer Klasse zu erhalten. In Bezug auf die Leistung umgeht die Zulassung von Eigenschaften die Notwendigkeit trivialer Accessor-Methoden, wenn ein direkter Variablenzugriff sinnvoll ist. Dies ermöglicht es auch, in der Zukunft Zugriffsmethoden hinzuzufügen, ohne die Schnittstelle zu zerstören.
und Nachteile:
Muss erben von object
in Python 2. Kann Seiteneffekte verbergen, ähnlich wie das Überladen von Operatoren. Kann für Unterklassen verwirrend sein.