Il est assez facile d'utiliser le __getattr__
méthode spéciale sur les classes Python pour gérer les propriétés ou les fonctions manquantes, mais apparemment pas les deux en même temps.
Considérons cet exemple qui traite toute propriété demandée qui n'est pas définie explicitement ailleurs dans la classe...
class Props:
def __getattr__(self, attr):
return 'some_new_value'
>>> p = Props()
>>> p.prop # Property get handled
'some_new_value'
>>> p.func('an_arg', kw='keyword') # Function call NOT handled
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: 'str' object is not callable
Ensuite, considérons cet exemple qui gère tout appel de fonction non défini explicitement ailleurs dans la classe...
class Funcs:
def __getattr__(self, attr):
def fn(*args, **kwargs):
# Do something with the function name and any passed arguments or keywords
print attr
print args
print kwargs
return
return fn
>>> f = Funcs()
>>> f.prop # Property get NOT handled
<function fn at 0x10df23b90>
>>> f.func('an_arg', kw='keyword') # Function call handled
func
('an_arg',)
{'kw': 'keyword'}
La question est de savoir comment traiter les deux types d'attributs manquants dans le même fichier. __getattr__
? Comment détecter si l'attribut demandé est en notation propriété ou en notation méthode avec des parenthèses et retourner respectivement une valeur ou une fonction ? Essentiellement, je veux gérer QUELQUES attributs de propriété manquants ET QUELQUES attributs de fonction manquants, puis recourir au comportement par défaut pour tous les autres cas.
Des conseils ?