Heim  >  Artikel  >  Backend-Entwicklung  >  Funktionsdekoratoren in Python: @property-, Getter- und Setter-Methoden verstehen

Funktionsdekoratoren in Python: @property-, Getter- und Setter-Methoden verstehen

DDD
DDDOriginal
2024-09-22 18:25:32112Durchsuche

Function Decorators in Python: Understanding @property, Getter, and Setter Methods

In der objektorientierten Programmierung ist Kapselung ein grundlegendes Konzept, das entscheidend für die Gewährleistung der Datenintegrität und das Verbergen von Implementierungsdetails vor dem Benutzer ist. Python, das für seine Einfachheit und Lesbarkeit bekannt ist, verwendet als Teil dieser Kapselung Getter und Setter. Dieser Artikel befasst sich mit dem Zweck und der Implementierung von Gettern und Settern in Python und bietet Einblicke in ihre Rolle bei der Verwaltung des Datenzugriffs und der Aufrechterhaltung der Objektintegrität. Insbesondere werden wir untersuchen, wie der @property-Dekorator in Python diese Konzepte vereinfacht und einen pythonischeren Ansatz für den Zugriff auf und die Aktualisierung von Objektattributen ermöglicht.

Kapselung und die Bedeutung privater Variablen
Im Mittelpunkt der Kapselung steht die Idee des Datenversteckens – die Kontrolle des Zugriffs auf den internen Zustand eines Objekts, um unbeabsichtigte Eingriffe oder Missbrauch zu verhindern. Dies erfordert die Verwendung von privaten Variablen. In vielen Programmiersprachen werden private Variablen verwendet, um sicherzustellen, dass vertrauliche Daten innerhalb eines Objekts ohne entsprechende Autorisierung nicht direkt aufgerufen oder geändert werden können, wodurch die Integrität des gegebenen Objekts gewahrt bleibt.
Python verfügt nicht wie einige andere Sprachen über strikte private Variablen, sondern verwendet stattdessen die Konvention, einem Attribut entweder einen einfachen () oder einen doppelten (_) Unterstrich voranzustellen, um anzuzeigen, dass es für den internen Gebrauch bestimmt ist. Lassen Sie uns den Unterschied zwischen diesen beiden Konventionen aufschlüsseln.

Einzelner Unterstrich (_) vs. doppelter Unterstrich (__) in Python

a. Einzelner Unterstrich (_):

  • Ein einzelner Unterstrich am Anfang einer Variablen (z. B. _price) ist eine Konvention, die angibt, dass das Attribut für den internen Gebrauch bestimmt ist. Es wird von Python nicht strikt erzwungen, was bedeutet, dass auf das Attribut weiterhin von außerhalb der Klasse zugegriffen werden kann (d. h. es ist nicht privat). Allerdings signalisiert es anderen Entwicklern, dass das Attribut „geschützt“ ist und nicht direkt darauf zugegriffen werden sollte, es sei denn, dies ist erforderlich. Beispiel:
class Product:
    def __init__(self, price):
        self._price = price  # Protected attribute (convention)

product = Product(10)
print(product._price)  # Accessing is possible, but discouraged

b. Doppelter Unterstrich (__):

  • Ein doppelter Unterstrich am Anfang einer Variablen (z. B. __price) löst eine Namensverfälschung aus. Durch die Namensveränderung wird der Name des Attributs intern geändert, um versehentlichen Zugriff oder Änderungen von außerhalb der Klasse zu verhindern. Dies erschwert den direkten Zugriff auf das Attribut, obwohl es immer noch nicht vollständig privat ist – Python benennt das Attribut intern um, indem es ihm _ClassName voranstellt, sodass es nur über seinen entstellten Namen (z. B. _Product__price) zugänglich ist. Beispiel:
class Product:
    def __init__(self, price):
        self.__price = price  # Name-mangled attribute

product = Product(10)
# print(product.__price)  # This will raise an AttributeError
print(product._Product__price)  # Accessing the mangled attribute
  • Sie sind nützlich, wenn Sie ein versehentliches Überschreiben von Attributen in Unterklassen vermeiden möchten oder einen stärkeren Schutz gegen unbeabsichtigten externen Zugriff wünschen.

Warum private Attribute verwenden?
Private Attribute, insbesondere solche, die mit einem einzelnen Unterstrich (_) gekennzeichnet sind, sind für die Aufrechterhaltung der Kapselung wichtig. Sie schützen den internen Zustand eines Objekts, indem sie externen Code davon abhalten, direkt mit ihm zu interagieren, was Folgendes hilft:

  1. Datenintegrität bewahren: Private Attribute verhindern eine versehentliche Änderung sensibler oder kritischer interner Daten.
  2. Kontrollierten Zugriff aktivieren: Durch die Verwendung von Getter- und Setter-Methoden (oder dem @property-Dekorator) steuert das Objekt, wie und wann auf seine Attribute zugegriffen oder diese geändert werden, und fügt häufig eine Validierungslogik hinzu.
  3. Wartbarkeit verbessern: Da interne Details ausgeblendet sind, können Sie die zugrunde liegende Implementierung ändern, ohne das externe Verhalten Ihrer Klasse zu beeinträchtigen.

Traditionelle Getter- und Setter-Methoden
In vielen Programmiersprachen werden Getter und Setter verwendet, um kontrollierten Zugriff auf private Variablen zu ermöglichen. Siehe das Beispiel unten:

class Product:
    def __init__(self, price):
        self._price = price  # Protected attribute

    def get_price(self):
        return self._price

    def set_price(self, value):
        if value >= 0:
            self._price = value
        else:
            raise ValueError("Price cannot be negative")

product = Product(10)
print(product.get_price())  # 10
product.set_price(20)
print(product.get_price())  # 20

In diesem Beispiel bieten der Getter (get_price()) und der Setter (set_price()) eine Möglichkeit, auf das _price-Attribut zuzugreifen und es zu ändern und gleichzeitig bestimmte Regeln durchzusetzen (z. B. sicherzustellen, dass der Preis nicht negativ ist).

Der @property Decorator
Python bietet eine elegantere Möglichkeit, den Zugriff auf private Attribute mithilfe des @property-Dekorators zu verwalten. Mit diesem Dekorator können Sie Methoden definieren, die sich wie Attribute verhalten, wodurch der Code lesbarer und pythonischer wird und gleichzeitig ein kontrollierter Zugriff ermöglicht wird.

Verwendung des @property Decorator für Getter und Setter
Unten sehen Sie das vorherige Beispiel, das mit @property umgestaltet wurde, um die Syntax zu vereinfachen und die Lesbarkeit zu verbessern:

class Product:
    def __init__(self, price):
        self._price = price

    @property
    def price(self):
        return self._price

    @price.setter
    def price(self, value):
        if value >= 0:
            self._price = value
        else:
            raise ValueError("Price cannot be negative")

product = Product(10)
print(product.price)  # 10
product.price = 20
print(product.price)  # 20

In dieser überarbeiteten Version:

  • Der @property Decorator ermöglicht uns den Zugriff auf price() wie auf ein Attribut, d. h. product.price, anstatt eine Getter-Methode wie product.get_price() aufrufen zu müssen.

  • Der @price.setter-Dekorator ermöglicht die Logik zum Festlegen des Preiswerts, sodass wir ihn auf „product.price = 20“ festlegen und gleichzeitig die Validierungsregeln durchsetzen können.

Warum @property verwenden?
Der @property-Dekorator macht Ihren Code übersichtlicher und benutzerfreundlicher, insbesondere beim Umgang mit privaten Attributen. Hier ist der Grund:

  1. Lesbarkeit: Es ermöglicht den natürlichen Zugriff auf Attribute, während die zugrunde liegende Logik für die Validierung oder Transformation verborgen bleibt.
  2. Kapselung: Sie können Regeln für den Zugriff auf oder die Änderung von Attributen erzwingen, ohne interne Implementierungsdetails preiszugeben.
  3. Flexibilität: Sie können das interne Verhalten umgestalten, ohne die externe Schnittstelle zu ändern, was bedeutet, dass der Rest Ihrer Codebasis nicht beeinträchtigt wird.

Fazit
Kapselung ist ein Eckpfeiler der objektorientierten Programmierung, und die Verwendung privater Variablen in Python bietet zusammen mit dem @property-Dekorator eine saubere und flexible Möglichkeit, den Zugriff auf den internen Zustand eines Objekts zu verwalten. Während Attribute mit einem einzelnen Unterstrich (_) signalisieren, dass sie für den internen Gebrauch bestimmt sind, bieten Attribute mit doppeltem Unterstrich (__) einen stärkeren Schutz durch Namensverfälschung. Mit dem @property Decorator können Sie den kontrollierten Zugriff auf diese privaten Attribute auf pythonische und lesbare Weise implementieren und so die Datenintegrität sicherstellen und gleichzeitig eine saubere öffentliche Schnittstelle aufrechterhalten.

Referenzen

  • Python-Dokumente auf Eigentum

  • PEP 318: Funktionsdekorateure

Das obige ist der detaillierte Inhalt vonFunktionsdekoratoren in Python: @property-, Getter- und Setter-Methoden verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn