gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:24:29 24 4
gpt4 key购买 nike

我想知道如何在可以接受类变量的类中设置装饰器。我认为这可能有用的示例是在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com