python - 传递类变量时类对象中的装饰器

标签 python pyqt4 decorator pyside

我想知道如何在可以接受类变量的类中设置装饰器。我认为这可能有用的示例是在 Pyside/PyQt 中,我需要在函数开始和结束时阻止和取消阻止小部件上的信号。

示例:

class Window(QtGui.QMainWindow):
    ....

    def updateList(self, *args):
        self.list.blockSignals(False)
        //do things on self.list
        self.list.blockSignals(True)

现在,不同小部件上的很多地方都可以实现这一点。当然,我可以用这种方法来阻止和解除阻止每个项目,但这很乏味。我必须记住在完成后解锁所有内容。

进入另一个步骤,我可以将阻塞移动到它自己的函数中。

class Window(QtGui.QMainWindow):
    ....

    def updateList(self, *args):
        self.block([self.list])
        //do things on self.list
        self.block([self.list])

    def block(self, items):
        for item in items:
            if item.signalsBlocked():
                item.blockSignals(False)
            else:
                item.blockSignals(True)

甜甜的!我可以在我的代码中添加它,并且感觉非常有用。但我觉得我在这里缺少某种最终的老板形式,以使其真正在全局范围内有用。就像某种装饰器。

使用这里的答案,我可以将变量传递给我的装饰器并装饰我的函数! Decorators with parameters?

def block(items):
    def dec(fn):
        def wrapped(*args, **kwargs):
            for item in items:
                item.blockSignals(True)
            fn(*args, **kwargs)
            for item in items:
                item.blockSignals(False)
        return wrapped
    return dec


class Window(QtGui.QMainWindow):
    ....

    @block([self.list])
    def updateList(self, *args):
        //do things on self.list

现在我觉得这确实有用!除了 @block([self.list]) 不知道 self 是什么。

那么,我正在尝试做的事情,假设我能做到这一点是否合理?有可能吗,还是我在追野龙?如果可能的话,尝试此操作的正确方法是什么?

最佳答案

您不能在类定义时引用属性,但可以使用它们的名称:

def block(*attrs):
    def dec(fn):
        @functools.wraps(fn)
        def wrap(self,*args,**kwargs):
            for a in attrs: getattr(self,a).blockSignals(True)
            ret=fn(self, *args, **kwargs)
            for a in attrs: getattr(self,a).blockSignals(False)
            return ret
        return wrap
    return dec

写起来有点难看

class Window(QtGui.QMainWindow):
    @block("list1","list2")
    def updateList(self, *args): # ...

带有字符串引号和所有内容,但它有效。

关于python - 传递类变量时类对象中的装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46353866/

相关文章:

python - 如何将一个函数延迟 X 个滴答数?

python - 单选按钮重定向 url 不起作用

python - 在 PyQt4 中使用 PyQtGraph 进行实时绘图

typescript 装饰二传手功能

Python:静态变量装饰器

python - json.loads 输入字符串格式错误

python - 如何从 Anaconda Tensorflow 环境启动 Spyder?

python - QFileDialog 和路径中的德语元音变音

windows-7 - cx_freeze pyqt4 示例 ("\samples\PyQt4") 不起作用

ruby-on-rails - 如何使用同一张表为一组模型创建装饰器?