Skip to content Skip to sidebar Skip to footer

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_statementattribute 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__"