Wie kann ich streiten python-lookups:machen.bis.ein.Punkt.getrennt.name.und.verwenden.es.bis.zerstört = 777

StackOverflow https://stackoverflow.com/questions/1602745

  •  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
War es hilfreich?

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 eine AttributeError 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ühren self.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 Beispiel object.__setattr__(self, name, value).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top