I’m trying to redifine the __getattr__ method, in a function.
I’ve tried this code:
def foo():
print("foo")
def addMethod(obj, func):
setattr(obj, func.__name__, types.MethodType(func, obj))
def __getattr__(obj, name):
print(name)
addMethod(foo, __getattr__)
foo.bar
but I get this error:
Traceback (most recent call last):
File blah blah, line 14, in <module>
foo.bar
AttributeError: 'function' object has no attribute 'bar'
I’ve inspected the “foo” function and it really has the method bounded to it, but it seems that if you set it dynamically, __getattr__ won’t get called.
If I do the same thing to a class, if I set the __getattr__ using my “addMethod” function, the instance won’t call the __getattr__ too!, so the problem must be the dynamic call!
BUT if I put the __getattr__ in the definition of the class, it will work, obviously.
The question is, how can I put the __getattr__ to the function to make it work? I can’t put it from the beginning because it’s a function!, I don’t know how to do this
Thanks!
Well, you don’t. If you want attributes, make a class. If you want instances to be callable, define
__call__for it.