693 Stimmen

Was ist der pythonische Weg, um Getter und Setter zu verwenden?

Ich mache es so:

def set_property(property,value):  
def get_property(property):  

o

object.property = value  
value = object.property

Ich bin neu in Python, so dass ich immer noch die Syntax zu erkunden, und ich würde gerne einige Ratschläge zu tun dies.

16voto

Kevin Little Punkte 11796

Überprüfen Sie die @property Tapezierer .

11voto

charlesw001 Punkte 136

Eigenschaften sind ziemlich nützlich, da man sie mit Zuweisung verwenden kann, aber dann auch eine Validierung einschließen kann. Sie können diesen Code sehen, wo Sie den Dekorator @property und auch @<property_name>.setter verwenden, um die Methoden zu erstellen:

# Python program displaying the use of @property 
class AgeSet:
    def __init__(self):
        self._age = 0

    # using property decorator a getter function
    @property
    def age(self):
        print("getter method called")
        return self._age

    # a setter function
    @age.setter
    def age(self, a):
        if(a < 18):
            raise ValueError("Sorry your age is below eligibility criteria")
        print("setter method called")
        self._age = a

pkj = AgeSet()

pkj.age = int(input("set the age using setter: "))

print(pkj.age)

Weitere Einzelheiten finden Sie in diesem Beitrag, den ich ebenfalls dazu geschrieben habe: https://pythonhowtoprogram.com/how-to-create-getter-setter-class-properties-in-python-3/

6voto

Tomasz Bartkowiak Punkte 8157

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.

3voto

Sie können die magischen Methoden verwenden __getattribute__ y __setattr__ .

class MyClass:
    def __init__(self, attrvalue):
        self.myattr = attrvalue
    def __getattribute__(self, attr):
        if attr == "myattr":
            #Getter for myattr
    def __setattr__(self, attr):
        if attr == "myattr":
            #Setter for myattr

Beachten Sie, dass __getattr__ y __getattribute__ sind nicht dasselbe. __getattr__ wird nur aufgerufen, wenn das Attribut nicht gefunden wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X