为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕村225694 2022-06-14 16:42:25
我正在使用一个 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__方法(这样的事情可能吗?
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

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


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'}

检查签名和绑定的文档

目录的文档


查看完整回答
反对 回复 2022-06-14
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信