[PYTHON] __Getattr__ und __getattribute__, um die Erfassung von Objektattributen durch Punkte anzupassen

Attribute mit . abrufen

Ich denke, dass die Attribute von Objekten wie Variablen und Methoden, die in der class-Anweisung definiert sind, normalerweise von . erfasst werden. Angenommen, Sie definieren die folgende Klasse.

python


class Foo:
    def __init__(self):
        self.foo = "foo"
        self.bar = "bar"

Die Attribute "foo" und "bar" der Instanz "foo" von "Foo" können mit "." Erhalten werden.

python


>>> foo = Foo()
>>> foo.foo
'foo'
>>> foo.bar
'bar'

Dieses . Verhalten kann mit den speziellen Attributen __getattr__ und __getattribute__ angepasst werden.

Anpassung mit __getattr__

Wenn Sie "getattr" definieren und versuchen, ein Attribut in "." Zu erhalten, wird zuerst die normale Namenssuche durchgeführt. Wenn das angegebene Attribut immer noch nicht gefunden wird, wird "getattr" aufgerufen und der zurückgegebene Wert verwendet. Gibt als dieses Attribut zurück.

Die folgende Klasse Foo definiert __getattr__, um immer die Mitgliedsvariable foo zurückzugeben.

python


class Foo:

    def __init__(self):
        self.foo = "foo"
        self.bar = "bar"
    
    def __getattr__(self, name):
        return self.foo

Die Instanz foo von Foo hat eine Mitgliedsvariable namens self.bar, also gibt foo.bar`` self.bar zurück, aber es gibt keine Mitgliedsvariable namens self.anything. Also wird "self .__ getattr__ (" irgendetwas ")" ausgeführt und "self.foo" (dh der String "foo") zurückgegeben.

python


>>> foo = Foo()
>>> foo.foo
'foo'
>>> foo.bar
'bar'
>>> foo.anything
'foo'

Anpassung mit __getattribute__

Wenn "getattribute" definiert ist, wird diese Methode aufgerufen, wenn Sie versuchen, ein Attribut in "." Zu erhalten. Wenn Sie in der Definition von "getattribute" versuchen, das Attribut dieses Objekts mit "." Abzurufen, wird Ihr eigenes "getattribute" rekursiv aufgerufen. Um dies zu vermeiden, wird das Objekt "Objekt" der Oberklasse " Verwenden Sie __getattribute__ von`.

python


class Bar:

    def __init__(self):
        self.foo = "foo"
        self.bar = "bar"
    
    def __getattribute__(self, name):
        return object.__getattribute__(self, "foo")

Wie Sie dem folgenden Ausführungsergebnis entnehmen können, hat die "bar" -Instanz "bar" eine Mitgliedsvariable mit dem Namen "self.bar", aber selbst wenn es "bar.bar" ist, ist es "getattribute". self.foo(dh die Zeichenfolge `` "foo") wird zurückgegeben.

python


>>> bar = Bar()
>>> bar.foo
'foo'
>>> bar.bar
'foo'
>>> bar.anything
'foo'

Eingebaute Funktionen getattr und hasattr

Die integrierten Funktionen "getattr" und "hasattr" basieren auf der Attributerfassung, die mit "getattr" und "hasattr" angepasst wurde. Das Abrufen der Attribute eines Objekts mit "getattr" ist also dasselbe wie das Abrufen mit ".". Wenn Sie im obigen Beispiel die Instanzen "Foo" und "Bar" überprüfen, sieht die Ausgabe folgendermaßen aus.

python


>>> getattr(foo, "bar")
'bar'
>>> getattr(bar, "bar")
'foo'

hasattr gibt immer True zurück, wenn __getattr__ oder __getattribute__ einen Wert zurückgibt, unabhängig davon, welches Attribut Sie angeben (dh AttributeError tritt nicht auf).

python


>>> hasattr(foo, "anything")
True
>>> hasattr(bar, "anything")
True

Recommended Posts

__Getattr__ und __getattribute__, um die Erfassung von Objektattributen durch Punkte anzupassen
So testen Sie die Attribute, die durch add_request_method of pyramid hinzugefügt wurden
Python Hinweis: Wenn Sie die Attribute eines Objekts kennen möchten
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
Ich möchte das Erscheinungsbild von zabbix anpassen
[Blender] So ermitteln Sie die Auswahlreihenfolge von Scheitelpunkten, Seiten und Flächen eines Objekts
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
[Python] Ändern Sie die Cache-Steuerung von Objekten, die in den Cloud-Speicher hochgeladen wurden
So erhöhen Sie die Verarbeitungsgeschwindigkeit der Erfassung der Scheitelpunktposition
Anwendung der affinen Umwandlung durch Tensor - von der Basis- zur Objekterkennung -
Eine Einführung in die Objektorientierung: Ändern Sie den internen Status eines Objekts
Schließen Sie den ersten Import des Moduls an und drucken Sie den Modulpfad
Anhängen an den Python-Prozess des SSH-Ziels und Debuggen
Ich möchte die Natur von Python und Pip kennenlernen
Befehle und Dateien zum Überprüfen der Version von CentOS Linux
So erhalten Sie den Pixelwert des Punkts aus dem Satellitenbild, indem Sie den Breiten- und Längengrad angeben
So erhalten Sie den NTP-Servernamen per DHCP und legen ihn fest
Wie Sie die interne Struktur eines Objekts in Python kennen
Automatische Erfassung von Genexpressionsdaten durch Python und R.
[EC2] So installieren Sie Chrome und den Inhalt jedes Befehls
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
[Python] So erhalten Sie den ersten und den letzten Tag des Monats
Ich habe zusammengefasst, wie die Boot-Parameter von GRUB und GRUB2 geändert werden
Verbesserung der Wiederverwendbarkeit und Wartbarkeit von mit Luigi erstellten Workflows
Konvertieren Sie das Ergebnis von Python Optparse, um es zu diktieren und zu verwenden
Der Versuch, Segmentbäume Schritt für Schritt zu implementieren und zu verstehen (Python)
Versuchen Sie, das Triplett des Bootsrennens vorherzusagen, indem Sie das Lernen bewerten
Ich möchte die legendäre Nintendo-Kombination wiederbeleben, indem ich AI und HR Tech voll ausnütze!