gpt4 book ai didi

python - 参数如何通过 __getattr__ 传递给函数

转载 作者:太空狗 更新时间:2023-10-29 17:41:57 25 4
gpt4 key购买 nike

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

class Parent:
def __init__(self, child):
self.child = child

def __getattr__(self, attr):
print("Calling __getattr__: "+attr)
if hasattr(self.child, attr):
return getattr(self.child, attr)
else:
raise AttributeError(attr)

class Child:
def make_statement(self, age=10):
print("I am an instance of Child with age "+str(age))

kid = Child()
person = Parent(kid)

kid.make_statement(5)
person.make_statement(20)

可以证明,函数调用 person.make_statement(20) 通过 Parent 调用了 Child.make_statement 函数__getattr__ 函数。在 __getattr__ 函数中,我可以在调用子实例中的相应函数之前打印出属性。到目前为止这么清楚。

但是 person.make_statement(20) 调用的参数是如何通过 __getattr__ 传递的?我怎样才能在我的 __getattr__ 函数中打印出数字“20”?

最佳答案

您没有在 __getattr__ 函数中打印 20。该函数在 Child 实例上找到 make_statement attribute 并返回它。碰巧的是,该属性是一个方法,因此它是可调用的。 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

如果您必须查看参数,则必须返回一个包装函数:

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

关于python - 参数如何通过 __getattr__ 传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13776504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com