.
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 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