第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

裝飾器替換重復(fù)的面向?qū)ο蟮拇a?

裝飾器替換重復(fù)的面向?qū)ο蟮拇a?

ibeautiful 2021-03-28 12:09:52
我正在使用Qt / PySide開發(fā)一個(gè)GUI,其中包含許多處理各種小部件的單獨(dú)類。每個(gè)小部件都管理按鈕和其他用戶輸入之間的信號(hào)。我發(fā)現(xiàn)自己不得不在方法功能開始時(shí)重用代碼來阻止小部件信號(hào),然后在最后釋放信號(hào)。我決定嘗試寫一個(gè)普通的裝飾器來為我做這件事。我已經(jīng)搜索了SO并嘗試以很少的使用裝飾器的經(jīng)驗(yàn)來實(shí)現(xiàn)最佳效果,因此我對(duì)自己的解決方案不滿意。我的問題是,編寫通用裝飾器的最佳方法是什么,該裝飾器可以訪問和運(yùn)行該類中遵循清晰格式的方法?無論如何,我的方法好嗎?
查看完整描述

1 回答

?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

您正在尋找getattr:


import functools


def blockSignals(*widgetnames):

    def decorator(func):

        @functool.wraps(func)

        def method(self, *args, **kwargs):

            widgets = [getattr(self.widget, name) for name in widgetnames]

            for widget in widgets:

                widget.blockSignals(True) 

            result = func(self, *args, **kwargs)

            for widget in widgets:

                widget.blockSignals(False)

            return result

        return method

    return decorator


class WidgetController(...):


    def __init__(...):

       self.widget.myWidget.currentIndexChanged.connect(reactToChange)


    @blockSignals('myWidget')

    def reactToChange(...):

        ...


    @blockSignals('anotherWidget', 'alsoBlockThisWidget')

    def anotherFunction(...):

        ...

您必須傳遞窗口小部件的名稱,而不是窗口小部件本身,因?yàn)榉椒ㄊ窃诙x類時(shí)定義的,而不是在實(shí)例化實(shí)例時(shí)定義的。實(shí)例self和實(shí)際的窗口小部件在self.widget類定義時(shí)不存在。


該functools.wraps裝飾機(jī)拷貝原函數(shù)的名稱及其文檔字符串的裝飾功能。


查看完整回答
反對(duì) 回復(fù) 2021-04-02
  • 1 回答
  • 0 關(guān)注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)