How Are Arguments Passed To A Function Through __getattr__
Consider the following code example (python 2.7): class Parent: def __init__(self, child): self.child = child def __getattr__(self, attr): print('Calling _
Solution 1:
You are not printing 20
in your __getattr__
function. The function finds the make_statement
attribute on the Child instance and returns that. As it happens, that attribute is a method, so it is callable. Python thus calls the returned method, and that method then prints 20
.
If you were to remove the ()
call, it would still work; we can store the method and call it separately to get 20
printed:
>>>person.make_statement
Calling __getattr__: make_statement
<bound method Child.make_statement of <__main__.Child instance at 0x10db5ed88>>
>>>ms = person.make_statement
Calling __getattr__: make_statement
>>>ms()
I am an instance of Child with age 10
If you have to see the arguments, you'd have to return a wrapper function instead:
def__getattr__(self, attr):
print("Calling __getattr__: "+attr)
ifhasattr(self.child, attr):
defwrapper(*args, **kw):
print('called with %r and %r' % (args, kw))
returngetattr(self.child, attr)(*args, **kw)
return wrapper
raise AttributeError(attr)
This now results in:
>>> person.make_statement(20)
Calling __getattr__: make_statement
called with (20,) and {}
I am an instance of Child with age 20
Post a Comment for "How Are Arguments Passed To A Function Through __getattr__"