. abrufenIch 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.
__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'
__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'
getattr und hasattrDie 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