https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8
Um Python zu studieren, habe ich eine Group Intelligence Library namens acopy kopiert.
In acopy werden viele interessante Python-Grammatiken und -Sprachen verwendet, und es wird zusammengefasst, dass dies unter ihnen praktisch ist.
Dieses Mal definieren wir eine spezielle Methode "getattr" in der Klasse.
Zum Abrufen von Attributen, die in einer Instanz in Python verwendet werden Es gibt eine Möglichkeit, auf "__dict __" zu verweisen.
Der Name des in der Instanz verwendeten Namespace wird in __dict__
als Wörterbuch definiert.
Nehmen Sie zum Beispiel das folgende Beispiel.
class A:
def __init__(self, x, y):
self.x = x
self.y = y
# {'x': 10, 'y': 20}
a = A(10, 20)
print(a.__dict__)
Die Instanz a hat die Namen $ x, y $ Sie können sie als Wörterbuch abrufen.
__getattr__
Sie können in einer Python-Klasse eine spezielle Methode namens "getattr" definieren.
Beim Aufrufen des Namens einer Python-Instanz Wenn es mit einem undefinierten Namen aufgerufen wird, wird ** AttributeError ** zurückgegeben.
Aber wenn __getattr__
definiert ist,
Anstatt einen AttributeError "bei einem Aufruf mit einem undefinierten Namen" zurückzugeben, wird "getattr" ausgeführt.
Schauen wir uns ein Beispiel an.
class A:
def __init__(self, x, y):
self.x = x
self.y = y
def __getattr__(self, name):
print(name, 'getattr')
if name == 'hello':
return self.world
raise AttributeError
def world(self, x):
return x
'''
{'x': 10, 'y': 20}
hello getattr
<bound method A.world of <__main__.A object at 0x10e602150>>
hello getattr
20
'''
a = A(10, 20)
print(a.__dict__)
print(a.hello)
print(a.hello(20))
Die Methode __getattr__
ist in der obigen Klasse A definiert.
Wenn ich versuche, "a.hello" aufzurufen, ist das Attribut "Hallo" nicht in a definiert. Daher wird die Methode getattr aufgerufen und gibt stattdessen die Methode world zurück.
In "a.hello (20)" wird zuerst die Weltmethode zurückgegeben, und die Weltmethode erhält den Wert 20 und wird ausgeführt. Daher wird es ausgeführt, wenn der Name Hallo bestätigt wird.
Wenn Sie die oben genannten Eigenschaften verwenden, wird daher der folgende nutzlose Code angewendet.
class A:
def __init__(self, x, y):
self.x = x
self.y = y
def __getattr__(self, name):
print(name, 'getattr')
if name == 'hello':
return self.world
if name == 'world':
return self.great
if name == 'great':
return self.bad
if name == 'bad':
return 0
raise AttributeError
'''
{'x': 10, 'y': 20}
hello getattr
world getattr
great getattr
bad getattr
0
'''
a = A(10, 20)
print(a.__dict__)
print(a.hello)
Ich kann mir nicht viele Anwendungsbeispiele vorstellen, Wenn es kein Attribut gibt, frage ich mich, ob es eine alternative Regelverarbeitung gibt. Es scheint auch, dass der Zweig usw. abhängig vom Anrufnamen geändert werden kann.
class A:
def __getattr__(self, name):
self.nothing(name)
def exist(self):
print('exist!')
def nothing(self, name):
print(f'nothing {name}')
'''
exist!
nothing unnti
'''
a = A()
a.exist()
a.unnti
Darüber hinaus als jeder Inhalt als separater Artikel zu einem späteren Zeitpunkt Es scheint, dass es auch verwendet werden kann, indem ein Ausnahmecode ausgelöst wird, wenn der Lambda-Ausdruck keinen Namen enthält.
Recommended Posts