gpt4 book ai didi

python - Python 中的动态包装器

转载 作者:行者123 更新时间:2023-11-28 22:19:25 25 4
gpt4 key购买 nike

我希望创建一个动态包装器类,它使用对象中的数据公开来自提供的对象的 API 调用。

静态看起来像这样:

 class Concrete:
def __init__(self, data):
self.data = data

def print_data(self):
print(self.data)


class Wrapper:
'''
One day this will wrap a variety of objects. But today
it can only handle Concrete objects.
'''
def wrap_it(self, concrete):
self.cco = concrete # concreteobject=cco

def print_data(self):
self.cco.print_data()


cco = Concrete(5)
wcco = Wrapper()
wcco.wrap_it(cco)
wcco.print_data()

生产

 5

我想弄清楚如何做同样的事情但是wrap_it 动态。它应该搜索具体对象查找函数,并创建同名函数在具体对象中调用相同的函数。

我想解决方案涉及 inspect.signature 或至少使用了一些 *args**kwargs,但我没见过有关如何将所有这些放在一起的示例。

最佳答案

您可以使用 __getattr__ Hook 获取未定义属性的魔术方法,并将它们转发给具体对象:

class DynamicWrapper():
def wrap_it(self, concrete):
self.cco = concrete

def __getattr__(self, k):
def wrapper(*args, **kwargs):
print(f'DynamicWrapper calling {k} with args {args} {kwargs}')
return getattr(self.cco, k)(*args, **kwargs)

if hasattr(self.cco, k):
return wrapper
else:
raise AttributeError(f'No such field/method: {k}')

cco = Concrete(5)
dwcco = DynamicWrapper()
dwcco.wrap_it(cco)
dwcco.print_data()

关于python - Python 中的动态包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49774996/

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