Heim Backend-Entwicklung Python-Tutorial Schwierige Verwendung von @property decorator in Python (Codebeispiel)

Schwierige Verwendung von @property decorator in Python (Codebeispiel)

Nov 23, 2018 pm 04:45 PM
python

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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 &#39;classobj&#39;>
Nach dem Login kopieren
class A(object): 
  pass 
>>type(A) 
<type &#39;type&#39;>
Nach dem Login kopieren

Aus dem zurückgegebenen , ist der Objekttyp, den wir benötigen (Python 3.0 verwendet die Objektklasse als Standardbasisklasse, daher werden alle ) zurückgeben.

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
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1677
14
PHP-Tutorial
1280
29
C#-Tutorial
1257
24
PHP und Python: Verschiedene Paradigmen erklärt PHP und Python: Verschiedene Paradigmen erklärt Apr 18, 2025 am 12:26 AM

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.

Wählen Sie zwischen PHP und Python: Ein Leitfaden Wählen Sie zwischen PHP und Python: Ein Leitfaden Apr 18, 2025 am 12:24 AM

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 und Python: Ein tiefes Eintauchen in ihre Geschichte PHP und Python: Ein tiefes Eintauchen in ihre Geschichte Apr 18, 2025 am 12:25 AM

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 gegen Python: Leistung und Skalierbarkeit Golang gegen Python: Leistung und Skalierbarkeit Apr 19, 2025 am 12:18 AM

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 gegen Python: Schlüsselunterschiede und Ähnlichkeiten Golang gegen Python: Schlüsselunterschiede und Ähnlichkeiten Apr 17, 2025 am 12:15 AM

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 vs. C: Lernkurven und Benutzerfreundlichkeit Python vs. C: Lernkurven und Benutzerfreundlichkeit Apr 19, 2025 am 12:20 AM

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 vs. C: Erforschung von Leistung und Effizienz erforschen Python vs. C: Erforschung von Leistung und Effizienz erforschen Apr 18, 2025 am 12:20 AM

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.

Python vs. JavaScript: Entwicklungsumgebungen und Tools Python vs. JavaScript: Entwicklungsumgebungen und Tools Apr 26, 2025 am 12:09 AM

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.

See all articles