子函数的Python装饰器

2024-09-29 17:18:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设计一个PyQt窗口,在其中调用FileOpenDialog。一旦从FileOpenDialog获得返回值,loadItem()将加载图像。我想记录这个事件并将其附加到log,这是一个QListWidget。我想用一个装饰器来实现这一点,以增强代码的可重用性和干净性。你知道吗

我已经创建了一个名为logAction的类装饰器,它将根据函数和*参数向QListWidget添加一个字符串。你知道吗

class logAction:
    def __init__(self, function):
        self.function=function
    def __call__(self, *args, **kwargs):
        if(function.__name__ == "promptOpen"):
            self.logOpen()

    def logOpen(*args, **kwargs):
        import re
        extensionPattern = re.compile(r"""
        ^(.+?)
        ([^\\]+)$
        """, re.VERBOSE)
        file = extensionPattern.search(args[0])

        self.log.addItem(f"Loaded {file}")


def promptOpen(self):
    self.openDialog = FileOpenDialog(self)

    @logAction
    def loadItem(path):
        pass

    loadItem(self.openDialog.filePath)

NameError: name 'logAction' is not defined

错误在@logAction处。如何允许loadItem()logAction修饰,而不将类放在promptOpen()中?你知道吗


Tags: nameselfrelogdefargsfunction装饰
1条回答
网友
1楼 · 发布于 2024-09-29 17:18:11
class test2:
    def __init__(self, func):
        self.func=func

    def __call__(self, *args, **kwargs):
        if(self.func.__name__ == "mama"):
            self.logOpen()
        return self.func(*args, **kwargs)

    def logOpen(self):
        print('well done')


def hi():

    @test2
    def mama():
        print('here')

    mama()

hi()

结果:干得好 这里

你写的if(function.__name__ == "loadItem"):没有self作为self.function.__name__函数名是错误的,它没有指向正确的函数名

我只是想用我的方式复制一下你的代码。你知道吗

如果您添加if(self.function.__name__ == "loadItem"),您的代码将会很好

class logAction:
    def __init__(self, function):
        self.function=function
    def __call__(self, *args, **kwargs):
        if(self.function.__name__ == "loadItem"):
            self.logOpen()

    def logOpen(*args, **kwargs):
        import re
        extensionPattern = re.compile(r"""
        ^(.+?)
        ([^\\]+)$
        """, re.VERBOSE)
        file = extensionPattern.search(args[0])

        self.log.addItem(f"Loaded {file}")


def promptOpen(self):
    self.openDialog = FileOpenDialog(self)

    @logAction
    def loadItem(path):
        pass

    loadItem(self.openDialog.filePath)

相关问题 更多 >

    热门问题