亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一次覆蓋所有類方法來做同樣的事情

一次覆蓋所有類方法來做同樣的事情

慕村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 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號