Python 参数是如何通过uu getattr传递给函数的__

Python 参数是如何通过uu getattr传递给函数的__,python,function,inheritance,arguments,getattr,Python,Function,Inheritance,Arguments,Getattr,考虑以下代码示例(python 2.7): 可以显示,函数调用person.make_语句(20)调用子函数。make_语句函数通过父函数的\uu getattr\uu函数。在\uuuu getattr\uuuu函数中,我可以在调用子实例中相应的函数之前打印出属性。到目前为止,一切都很清楚 但是调用person.make_语句(20)的参数是如何通过传递的呢?我如何才能在我的\uuuu getattr\uuuuu函数中打印出数字“20?”您的\uu getattr\uuuuu函数中没有打印20。

考虑以下代码示例(python 2.7):

可以显示,函数调用
person.make_语句(20)
调用
子函数。make_语句
函数通过
父函数的
\uu getattr\uu
函数。在
\uuuu getattr\uuuu
函数中,我可以在调用子实例中相应的函数之前打印出属性。到目前为止,一切都很清楚


但是调用person.make_语句(20)
的参数是如何通过
传递的呢?我如何才能在我的
\uuuu getattr\uuuuu
函数中打印出数字“20?”

您的
\uu getattr\uuuuu
函数中没有打印
20
。函数在子实例上查找
make_语句
属性并返回该属性。碰巧,该属性是一个方法,因此它是可调用的。Python因此调用返回的方法,然后该方法打印
20

如果要删除
()
调用,它仍然可以工作;我们可以存储该方法并单独调用,以打印
20

>>> 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
这将导致:

>>> person.make_statement(20)
Calling __getattr__: make_statement
called with (20,) and {}
I am an instance of Child with age 20

@亚历克斯:更新后,你需要一个包装器函数。是的,从你的解释来看,我也有同样的想法,但我需要更长的时间才能实现。非常感谢,这似乎回答了我的问题。不过还有一个问题:您的解决方案即使在unittest框架内也能工作吗?我看到你的解决方案在这种情况下似乎不起作用,我正试图进一步确定它。@Alex:不知道你的意思。如果希望unittest框架仍然检测
test*
方法,则需要添加
\uuuu dir\uuu
方法以列出所有代理的方法名称,请参阅
def __getattr__(self, attr):
    print("Calling __getattr__: "+attr)
    if hasattr(self.child, attr):
        def wrapper(*args, **kw):
            print('called with %r and %r' % (args, kw))
            return getattr(self.child, attr)(*args, **kw)
        return wrapper
    raise AttributeError(attr)
>>> person.make_statement(20)
Calling __getattr__: make_statement
called with (20,) and {}
I am an instance of Child with age 20