Heim  >  Artikel  >  Backend-Entwicklung  >  Wie fügt man in Python dynamisch Eigenschaften zu einer Klasse hinzu?

Wie fügt man in Python dynamisch Eigenschaften zu einer Klasse hinzu?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-09 22:40:02576Durchsuche

How do you add properties to a class dynamically in Python?

So fügen Sie einer Klasse Eigenschaften dynamisch hinzu

Problem

Sie möchten eine Scheinklasse erstellen, die eine Datenbankergebnismenge nachahmt. Wenn eine Datenbankabfrage beispielsweise {'ab':100, 'cd':200} zurückgibt, erwarten Sie Folgendes:

>>> dummy.ab
100

Lösung

Obwohl das Hinzufügen einer Eigenschaft zu a Wenn eine Klasse dynamisch möglich ist, muss sie der Klasse selbst hinzugefügt werden.

>>> class Foo(object):
...     pass
...
>>> foo = Foo()
>>> foo.a = 3
>>> Foo.b = property(lambda self: self.a + 1)
>>> foo.b
4

Eine Eigenschaft ist eine einfache Implementierung eines Deskriptors, bei dem es sich um ein Objekt handelt, das bereitstellt Benutzerdefinierte Attributbehandlung für eine bestimmte Klasse. Es fungiert als Ersatz für einen umfangreichen if-Baum in __getattribute__.

Wenn Sie foo.b anfordern, erkennt Python, dass das in der Klasse definierte b dem Deskriptorprotokoll folgt, das einfach ein Objekt mit einem angibt get__, __set__ oder __delete-Methode. Der Deskriptor übernimmt die Verantwortung für die Verarbeitung dieses Attributs und veranlasst Python, Foo.b.__get__(foo, Foo) aufzurufen. Der Rückgabewert wird Ihnen als Wert des Attributs zurückgegeben. Im Fall einer Eigenschaft ruft jede dieser Methoden einfach das fget, fset oder fdel auf, das Sie dem Eigenschaftskonstruktor bereitgestellt haben.

Deskriptoren sind Pythons Mechanismus zum Offenlegen der Feinheiten seiner gesamten OO-Implementierung. Übrigens gibt es einen bestimmten Deskriptortyp, der noch weiter verbreitet ist als Eigentum.

>>> class Foo(object):
...     def bar(self):
...         pass
...
>>> Foo().bar
<bound method Foo.bar of <__main__.Foo object at 0x7f2a439d5dd0>>
>>> Foo().bar.__get__
<method-wrapper '__get__' of instancemethod object at 0x7f2a43a8a5a0>

Die bescheidene Methode ist ein weiterer Deskriptortyp. Sein get stellt die aufrufende Instanz als erstes Argument voran; Im Wesentlichen geschieht Folgendes:

def __get__(self, instance, owner):
    return functools.partial(self.function, instance)

Das ist wahrscheinlich der Grund, warum Deskriptoren nur für Klassen gelten: Sie formalisieren die Mechanismen, die Klassen überhaupt zugrunde liegen. Sie stellen die Ausnahme von der Regel dar: Sie können einer Klasse zweifellos Deskriptoren zuweisen, obwohl Klassen selbst Typinstanzen sind. Tatsächlich ruft der Versuch, Foo.bar abzurufen, immer noch property.__get__; Es ist jedoch idiomatisch, dass Deskriptoren sich selbst zurückgeben, wenn auf sie als Klassenattribute zugegriffen wird.

Deskriptoren ermöglichen es, den Großteil des OO-Systems von Python in Python selbst zu schreiben.

Das obige ist der detaillierte Inhalt vonWie fügt man in Python dynamisch Eigenschaften zu einer Klasse hinzu?. 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