https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8
Afin d'étudier Python, j'ai copié une bibliothèque d'intelligence de groupe appelée acopy.
Dans acopy, de nombreuses grammaires et idiomes Python intéressants sont utilisés, et il est résumé que c'est utile parmi eux.
Cette fois, définissons une méthode spéciale __getattr__
dans la classe.
Comme moyen de récupérer les attributs utilisés dans une instance en Python Il existe un moyen de faire référence à «__dict __».
Le nom de l'espace de noms utilisé dans l'instance est défini comme un dictionnaire dans __dict__
.
Par exemple, prenez l'exemple suivant.
class A:
def __init__(self, x, y):
self.x = x
self.y = y
# {'x': 10, 'y': 20}
a = A(10, 20)
print(a.__dict__)
L'instance a a les noms $ x, y $ Vous pouvez les récupérer sous forme de dictionnaire.
__getattr__
Vous pouvez définir une méthode spéciale appelée __getattr__
dans une classe Python.
En appelant le nom d'une instance de Python S'il est appelé avec un nom non défini, il retournera ** AttributeError **.
Mais si __getattr__
est défini,
Au lieu de renvoyer une AttributeError "lors d'un appel avec un nom non défini", __getattr__
est exécuté.
Regardons un exemple.
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))
La méthode __getattr__
est définie dans la classe A ci-dessus.
Lorsque j'essaye d'appeler ʻa.hello, l'attribut hello n'est pas défini dans a. Par conséquent, la méthode
getattr` est appelée et renvoie la méthode world à la place.
Dans ʻa.hello (20) `, la méthode world est retournée en premier, et la méthode world reçoit une valeur de 20 et est exécutée. Par conséquent, il est exécuté lorsque le nom bonjour est confirmé.
Par conséquent, si vous utilisez les propriétés ci-dessus, le code inutile suivant sera appliqué.
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)
Je ne peux pas penser à de nombreux exemples d'application, S'il n'y a pas d'attribut, je me demande s'il existe un autre traitement des règles. De plus, il semble que la succursale, etc., puisse être modifiée en fonction du nom de l'appel.
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
En outre, chaque contenu en tant qu'article distinct à une date ultérieure Il semble qu'il puisse également être utilisé en lançant un code d'exception lorsqu'il n'y a pas de nom dans l'expression lambda.