


Schwierige Verwendung von @property decorator in Python (Codebeispiel)
In diesem Artikel geht es um die technische Verwendung des @property-Dekorators in Python (Codebeispiele). Ich hoffe, dass er für Sie hilfreich ist.
Der @property decorator kann eine Methode in eine Eigenschaft umwandeln und sie aufrufen. Werfen wir einen Blick auf die Analyse der Verwendungsfähigkeiten des @property decorators in Python.
@ Wofür werden Attribute verwendet? ? Oberflächlich betrachtet scheint es, dass auf eine Methode als Attribut zugegriffen wird.
Der obige Code
class Circle(object): def __init__(self, radius): self.radius = radius @property def area(self): return 3.14 * self.radius ** 2 c = Circle(4) print c.radius print c.area
zeigt, dass der Bereich zwar als Methode definiert ist, nach dem Hinzufügen der @-Eigenschaft jedoch direkt auf c.area als Eigenschaft zugegriffen werden kann.
Jetzt kommt das Problem. Jedes Mal, wenn c.area aufgerufen wird, wird es nur einmal berechnet. Das ist die Eigenschaft der Faulheit.
class lazy(object): def __init__(self, func): self.func = func def __get__(self, instance, cls): val = self.func(instance) setattr(instance, self.func.__name__, val) return val class Circle(object): def __init__(self, radius): self.radius = radius @lazy def area(self): print 'evalute' return 3.14 * self.radius ** 2 c = Circle(4) print c.radius print c.area print c.area print c.area
Wie Sie sehen, wird „evalute“ nur einmal ausgegeben, daher sollten Sie den Mechanismus von @Lazy gut verstehen.
Hier verfügt die Lazy-Klasse über eine __get__-Methode, die darauf hinweist, dass es sich bei der ersten Ausführung von c.area aufgrund von Auftragsproblemen zunächst um eine Suche in Ç.__dict__ handelt wurde nicht gefunden, gehen Sie einfach zum Klassenraum, um ihn zu finden. Im Klassenkreis gibt es die Methode „area()“, also wird sie von __get__ abgefangen.
Rufen Sie in __get__ die Region()-Methode der Instanz auf, um das Ergebnis zu berechnen, und fügen Sie der Instanz dynamisch ein Attribut mit demselben Namen hinzu und weisen Sie ihr das Ergebnis zu, dh fügen Sie es zu Ç hinzu. __ dict__.
Wenn Sie c.area erneut ausführen, gehen Sie zuerst zu Ç.__ dict__, um es zu finden, da es zu diesem Zeitpunkt bereits existiert, sodass Sie nicht die Methode „area()“ und „__get__“ durchlaufen müssen.
Hinweise
Bitte beachten Sie folgende Code-Szenarien:
Code-Schnipsel 1:
class Parrot(object): def __init__(self): self._voltage = 100000 @property def voltage(self): """Get the current voltage.""" return self._voltage if __name__ == "__main__": # instance p = Parrot() # similarly invoke "getter" via @property print p.voltage # update, similarly invoke "setter" p.voltage = 12
Code-Schnipsel 2:
class Parrot: def __init__(self): self._voltage = 100000 @property def voltage(self): """Get the current voltage.""" return self._voltage if __name__ == "__main__": # instance p = Parrot() # similarly invoke "getter" via @property print p.voltage # update, similarly invoke "setter" p.voltage = 12
Code 1, der Unterschied zwischen 2 ist
Klasse Parrot (Objekt):
Führen Sie den Test unter Python2 separat aus
Fragment 1: Eine erwartete Fehlermeldung AttributeError: Unable to werden aufgefordert, die Eigenschaft festzulegen
Fragment 2: Korrekt ausführen
Siehe die Python2-Dokumentation, die ein schreibgeschütztes Attribut bereitstellt Es liegt auf der Hand, dass der Code in Fragment 2 zu einem Fehler beim Ausführen führt. In der Python2-Dokumentation finden wir die folgenden Informationen:
BIF:
property ([fget [, fset [ , fdel [, doc]]]])
Gibt die Attributeigenschaften der neuen Stilklasse zurück (von Object abgeleitete Klassen).
Es stellt sich heraus, dass unter Python2 das integrierte Typobjekt nicht die Standardbasisklasse ist. Wenn es beim Definieren der Klasse (Code-Snippet 2) keine klare Erklärung gibt, wird der von uns definierte Parrot (Code-Snippet 2) verwendet ) erbt kein Objekt
Die Objektklasse stellt lediglich die @property-Funktion bereit, die wir benötigen. Wir können die folgenden Informationen im Dokument finden:
Neue Stilklasse
Jede Klasse das erbt von object . Dazu gehören alle integrierten Typen wie list und dict. Nur Klassen neuen Stils können die neueren, generischen Funktionen von Python wie __slots__, Deskriptoren, Attribute und __getattribute__() verwenden.
Gleichzeitig können wir dies auch mit der folgenden Methode überprüfen
class A: pass >>type(A) <type 'classobj'>
class A(object): pass >>type(A) <type 'type'>
Aus dem zurückgegebenen
Um zu berücksichtigen Frage zur Kompatibilität der Python-Version Übergangszeit des Codes: Ich denke, dass Objekte beim Definieren von Klassendateien explizit definiert werden sollten.
Der endgültige Code wird wie folgt aussehen:
class Parrot(object): def __init__(self): self._voltage = 100000 @property def voltage(self): """Get the current voltage.""" return self._voltage @voltage.setter def voltage(self, new_value): self._voltage = new_value if __name__ == "__main__": # instance p = Parrot() # similarly invoke "getter" via @property print p.voltage # update, similarly invoke "setter" p.voltage = 12
Das obige ist der detaillierte Inhalt vonSchwierige Verwendung von @property decorator in Python (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











PHP ist hauptsächlich prozedurale Programmierung, unterstützt aber auch die objektorientierte Programmierung (OOP). Python unterstützt eine Vielzahl von Paradigmen, einschließlich OOP, funktionaler und prozeduraler Programmierung. PHP ist für die Webentwicklung geeignet, und Python eignet sich für eine Vielzahl von Anwendungen wie Datenanalyse und maschinelles Lernen.

PHP eignet sich für Webentwicklung und schnelles Prototyping, und Python eignet sich für Datenwissenschaft und maschinelles Lernen. 1.PHP wird für die dynamische Webentwicklung verwendet, mit einfacher Syntax und für schnelle Entwicklung geeignet. 2. Python hat eine kurze Syntax, ist für mehrere Felder geeignet und ein starkes Bibliotheksökosystem.

PHP entstand 1994 und wurde von Rasmuslerdorf entwickelt. Es wurde ursprünglich verwendet, um Website-Besucher zu verfolgen und sich nach und nach zu einer serverseitigen Skriptsprache entwickelt und in der Webentwicklung häufig verwendet. Python wurde Ende der 1980er Jahre von Guidovan Rossum entwickelt und erstmals 1991 veröffentlicht. Es betont die Lesbarkeit und Einfachheit der Code und ist für wissenschaftliche Computer, Datenanalysen und andere Bereiche geeignet.

Golang ist in Bezug auf Leistung und Skalierbarkeit besser als Python. 1) Golangs Kompilierungseigenschaften und effizientes Parallelitätsmodell machen es in hohen Parallelitätsszenarien gut ab. 2) Python wird als interpretierte Sprache langsam ausgeführt, kann aber die Leistung durch Tools wie Cython optimieren.

Golang und Python haben jeweils ihre eigenen Vorteile: Golang ist für hohe Leistung und gleichzeitige Programmierung geeignet, während Python für Datenwissenschaft und Webentwicklung geeignet ist. Golang ist bekannt für sein Parallelitätsmodell und seine effiziente Leistung, während Python für sein Ökosystem für die kurze Syntax und sein reiches Bibliothek bekannt ist.

Python ist leichter zu lernen und zu verwenden, während C leistungsfähiger, aber komplexer ist. 1. Python -Syntax ist prägnant und für Anfänger geeignet. Durch die dynamische Tippen und die automatische Speicherverwaltung können Sie die Verwendung einfach zu verwenden, kann jedoch zur Laufzeitfehler führen. 2.C bietet Steuerung und erweiterte Funktionen auf niedrigem Niveau, geeignet für Hochleistungsanwendungen, hat jedoch einen hohen Lernschwellenwert und erfordert manuellem Speicher und Typensicherheitsmanagement.

Python ist in der Entwicklungseffizienz besser als C, aber C ist in der Ausführungsleistung höher. 1. Pythons prägnante Syntax und reiche Bibliotheken verbessern die Entwicklungseffizienz. 2. Die Kompilierungsmerkmale von Compilation und die Hardwarekontrolle verbessern die Ausführungsleistung. Bei einer Auswahl müssen Sie die Entwicklungsgeschwindigkeit und die Ausführungseffizienz basierend auf den Projektanforderungen abwägen.

Sowohl Python als auch JavaScripts Entscheidungen in Entwicklungsumgebungen sind wichtig. 1) Die Entwicklungsumgebung von Python umfasst Pycharm, Jupyternotebook und Anaconda, die für Datenwissenschaft und schnelles Prototyping geeignet sind. 2) Die Entwicklungsumgebung von JavaScript umfasst Node.JS, VSCODE und WebPack, die für die Entwicklung von Front-End- und Back-End-Entwicklung geeignet sind. Durch die Auswahl der richtigen Tools nach den Projektbedürfnissen kann die Entwicklung der Entwicklung und die Erfolgsquote der Projekte verbessert werden.
