python装饰器的4种类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类

一:函数装饰函数

def wrapFun(func):
    def inner(a, b):
        print('function name:', func.__name__)
        r = func(a, b)
        return r
    return inner

@wrapFun
def myadd(a, b):
    return a + b

print(myadd(2, 3))

二:函数装饰类

def wrapClass(cls):
    def inner(a):
        print('class name:', cls.__name__)
        return cls(a)
    return inner

@wrapClass
class Foo():
    def __init__(self, a):
        self.a = a

    def fun(self):
        print('self.a =', self.a)


m = Foo('xiemanR')
m.fun()


三:类装饰函数

class ShowFunName():
    def __init__(self, func):
        self._func = func

    def __call__(self, a):
        print('function name:', self._func.__name__)
        return self._func(a)


@ShowFunName
def Bar(a):
    return a

print(Bar('xiemanR'))


四:类装饰类

class ShowClassName(object):
    def __init__(self, cls):
        self._cls = cls

    def __call__(self, a):
        print('class name:', self._cls.__name__)
        return self._cls(a)


@ShowClassName
class Foobar(object):
    def __init__(self, a):
        self.value = a

    def fun(self):
        print(self.value)

a = Foobar('xiemanR')
a.fun()

  • 19
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我可以回答这个问题。您可以使用QProgressDialog来创建一个进度对话框,然后将其作为装饰器包装您的函数。以下是一个示例代码: ```python from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtWidgets import QApplication, QWidget, QProgressDialog import time class WorkerThread(QThread): finished = pyqtSignal() def __init__(self, func, *args, **kwargs): super().__init__() self.func = func self.args = args self.kwargs = kwargs def run(self): self.func(*self.args, **self.kwargs) self.finished.emit() def wait_dialog(title, message): def decorator(func): def wrapper(*args, **kwargs): app = QApplication.instance() dialog = QProgressDialog(title, message, 0, 0, parent=app.activeWindow()) dialog.setWindowModality(2) dialog.show() thread = WorkerThread(func, *args, **kwargs) thread.finished.connect(dialog.accept) thread.start() dialog.exec_() return wrapper return decorator @wait_dialog("Please wait", "Function is running...") def my_function(): time.sleep(5) print("Function is done!") if __name__ == '__main__': app = QApplication([]) window = QWidget() window.show() my_function() app.exec_() ``` 在这个示例中,我们定义了一个`WorkerThread`,它继承自`QThread`,并包含一个`finished`信号。我们还定义了一个`wait_dialog`装饰器,它创建了一个进度对话框,并将其作为装饰器包装的函数的父窗口。在装饰器内部,我们创建了一个`WorkerThread`实例,并将其连接到进度对话框的`accept`槽,以便在函数执行完成后关闭对话框。 最后,我们使用`@wait_dialog`装饰器装饰我们的函数`my_function`,并在主函数中调用它。当我们运行这个程序时,它将显示一个进度对话框,等待函数执行完成,然后关闭对话框并打印出"Function is done!"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiemanR

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值