Wie kann ich streiten python-lookups:machen.bis.ein.Punkt.getrennt.name.und.verwenden.es.bis.zerstört = 777
-
05-07-2019 - |
Frage
Ich bin ein Python-Neuling mit einem sehr speziellen Juckreiz zu Experimentieren mit Python dot-Namen-lookup-Prozess.Wie code ich entweder eine Klasse oder eine Funktion in "make.py" also, dass diese Zuweisungsanweisungen Arbeit erfolgreich?
import make
make.a.dot.separated.name = 666
make.something.else.up = 123
make.anything.i.want = 777
Lösung
#!/usr/bin/env python
class Make:
def __getattr__(self, name):
self.__dict__[name] = Make()
return self.__dict__[name]
make = Make()
make.a.dot.separated.name = 666
make.anything.i.want = 777
print make.a.dot.separated.name
print make.anything.i.want
Das Besondere __getattr__
Methode wird aufgerufen, wenn ein benannter Wert, der nicht gefunden werden kann.Die Zeile make.anything.i.want
enden tut das äquivalent von:
m1 = make.anything # calls make.__getattr__("anything")
m2 = m1.i # calls m1.__getattr__("i")
m2.want = 777
Die obige Implementierung verwendet diese Anrufe zu __getattr__
erstellen Sie eine Kette von Make
Objekte, die jedes mal, wenn eine unbekannte Eigenschaft zugegriffen wird.Dies ermöglicht es der dot Zugriffe auf beliebig tief verschachtelt sein, bis die endgültige Zuweisung an die Stelle einer realen Wert zugewiesen wird.
Python-Dokumentation - customizing-Attribut zugreifen:
object.__getattr__(self, name)
Wird aufgerufen, wenn eine Attribut-lookup nicht gefunden hat, die das Attribut in den üblichen Orten (D. H.es ist nicht eine Instanz Attribut noch ist es zu finden in der Klasse Baum für
self
).name
ist der name des Attributs.Diese Methode sollte den (berechneten) Attributwert oder heben Sie eineAttributeError
Ausnahme.Beachten Sie, dass, wenn das Attribut gefunden wird, über dem normalen Mechanismus,
__getattr__()
ist nicht genannt.(Dies ist eine gewollte Asymmetrie zwischen__getattr__()
und__setattr__()
.) Dies ist sowohl aus Gründen der Effizienz und aufgrund sonst__getattr__()
würde keine Möglichkeit haben, den Zugang zu anderen Attribute der Instanz.Beachten Sie, dass zumindest für die Instanz-Variablen Sie können gefälschte totale Kontrolle durch nicht einfügen, die Werte in der Instanz-Attribut-dictionary - (aber, statt einfügen in ein anderes Objekt).Siehe die__getattribute__()
Methode unten für ein Weg, um tatsächlich Holen Sie sich die totale Kontrolle in new-style-Klassen.
object.__setattr__(self, name, value)
Wird aufgerufen, wenn ein Attribut die Zuordnung versucht wird.Diese aufgerufen wird, statt des normalen Mechanismus (D. H.speichern Sie den Wert in der Instanz-Wörterbuch).
name
ist der name des Attributs,value
ist der Wert zugeordnet werden.Wenn
__setattr__()
zuteilen will eine Instanz Attribut, es sollte nicht einfach ausführenself.name = value
— dies würde dazu führen, einen rekursiven Aufruf von sich selbst.Stattdessen sollten Sie den Wert einfügen, die im Wörterbuch der Instanz Attribute, z.B.,self.__dict__[name] = value
.Für new-style-Klassen, statt über den Zugriff auf die Instanz-Wörterbuch, sollte es die Basisklasse, die Methode mit dem gleichen Namen, zum Beispielobject.__setattr__(self, name, value)
.