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

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


有很多方法需要重写,如果他们改变 API,我必须让我的类与他们的完全匹配:维护很糟糕。

我用的是多处理,想把所有的数据打包成msgs,放到一个队列里,结果在另一个进程中处理,所以我不想把我的数据处理逻辑放到这个类里。

他们班级的精简版:


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__方法(这样的事情可能吗?


慕村225694
浏览 89回答 1
1回答

萧十郎

这是一种使用检查TheirWrapperwith内容的可能方法dir():import inspectclass TheirWrapper:&nbsp; &nbsp; def __init__(self):&nbsp; &nbsp; &nbsp; &nbsp; pass&nbsp; &nbsp; def func1(self, a, b, c):&nbsp; &nbsp; &nbsp; &nbsp; pass&nbsp; &nbsp; def func2(self, d, e, f):&nbsp; &nbsp; &nbsp; &nbsp; passclass MyWrapper:&nbsp; &nbsp; def addToQueue(self, localvars):&nbsp; &nbsp; &nbsp; &nbsp; # your implementation&nbsp; &nbsp; &nbsp; &nbsp; print(localvars)### You can orginize this block into decorator or metaclass and make more generaldef add_func(func_name):&nbsp; &nbsp; def add(self, *args, **kwargs):&nbsp; &nbsp; &nbsp; &nbsp; signature = inspect.signature(getattr(TheirWrapper, func_name))&nbsp; &nbsp; &nbsp; &nbsp; bind = signature.bind(self, *args, **kwargs)&nbsp; &nbsp; &nbsp; &nbsp; arguments = dict(bind.arguments)&nbsp; &nbsp; &nbsp; &nbsp; arguments['func_name'] = func_name&nbsp; &nbsp; &nbsp; &nbsp; self.addToQueue(arguments)&nbsp; &nbsp; return addfor name in dir(TheirWrapper):&nbsp; &nbsp; if not name.startswith('__'):&nbsp; &nbsp; &nbsp; &nbsp; 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'}检查签名和绑定的文档目录的文档
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python