gpt4 book ai didi

python - 一次覆盖所有类方法来做同样的事情

转载 作者:太空宇宙 更新时间:2023-11-03 15:30:20 25 4
gpt4 key购买 nike

我使用的是提供单个 Python 包装器类的第 3 方 API,其中包含约 50 个方法,除了接受一组任意参数外什么都不做。然后我打算创建自己的类并重写这些方法中的每一个来做我真正想要的。我的问题:

  • 有很多方法需要重写,如果他们更改 API,我必须让我的类与他们的完全匹配:维护很麻烦。
  • 我用的是multiprocessing,想把所有的数据都打包成msgs,放到一个queue中,然后在另一个进程中处理结果,所以我不想把我的数据处理逻辑放在这个类中。

他们类(class)的精简版:

class TheirWrapper:
def __init__(self):
pass
def func1(self, a, b, c):
pass
def func2(self, d, e, f):
pass
... and ~50 more

以及我正在工作的精简版本:

class MyWrapper:
def addToQueue(self, localvars):
# adds calling function name and localvars to queue (after removing self from localvars)
def func1(self, a, b, c):
self.addToQueue(locals())
def func1=2(self, d, e, f):
self.addToQueue(locals())
... and ~50 more

考虑到我在每个被覆盖的方法 (self.addToQueue(locals())) 中做了完全相同的事情,我希望能够一次覆盖他们所有的方法(除了 __init__) 来做那件事。这样的事情可能吗?

最佳答案

这是一种可能的方法,使用 dir() 检查 TheirWrapper 的内容:

import inspect


class TheirWrapper:
def __init__(self):
pass
def func1(self, a, b, c):
pass
def func2(self, d, e, f):
pass


class MyWrapper:
def addToQueue(self, localvars):
# your implementation
print(localvars)


### You can orginize this block into decorator or metaclass and make more general
def add_func(func_name):
def add(self, *args, **kwargs):
signature = inspect.signature(getattr(TheirWrapper, func_name))
bind = signature.bind(self, *args, **kwargs)
arguments = dict(bind.arguments)
arguments['func_name'] = func_name
self.addToQueue(arguments)
return add


for name in dir(TheirWrapper):
if not name.startswith('__'):
setattr(MyWrapper, name, add_func(name))
###

w = MyWrapper()
w.func1(1, 2, 3)
# prints {'self': <__main__.MyWrapper object at 0x00000000030262E8>, 'a': 1, 'b': 2, 'c': 3, 'func_name': 'func1'}

docs for inspect.signature & bind

docs for dir

关于python - 一次覆盖所有类方法来做同样的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58232546/

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