如何在Python装饰器中访问构造函数变量?

问题描述 投票:0回答:1

我创建了一个类并在其构造函数中声明了一些变量。

这个类也有一些方法。

我还创建了一个带有参数的装饰器。

我想要的是在这些方法之前使用该装饰器并从类构造函数传递变量之一。

下面是我的代码:

装饰者:

def thread_switch_decorator(argument):
    def decorator(function):
        def wrapper(*args, **kwargs):
            argument.stop()
            result = function(*args, **kwargs)
            argument.start()
            return result

        return wrapper

    return decorator

类和方法:

class MainWindow(QMainWindow):
    def __init__(self):
        self.my_thread = initiate_connect()
    
    @thread_switch_decorator(argument=self.my_thread) # <--- Here is the problem
    def home_page(self):
        pass

错误:

@thread_switch_decorator(argument=self.my_thread)
NameError: name 'self' is not defined

在上面使用装饰器的代码中,我无法从构造函数传递参数。这是符合逻辑的。

我的问题是,我该怎么做?

python multithreading class methods decorator
1个回答
0
投票

发生错误是因为您尝试将 self.my_thread 作为参数传递,但该特定行不存在

self
self
存在于类方法下,因为您将
self
作为参数传递给它。

如果你想将

my_thread
传递给装饰器,从逻辑上讲,你必须将它定义在可以访问的地方。

class MainWindow(QMainWindow):
    my_thread = initiate_connect() # add my thread here

    def __init__(self):
        pass # do not add the `my_thread` here
    
    @thread_switch_decorator(argument=my_thread) # <--- remove `self.`
    def home_page(self):
        pass

您可以这样做,但是代码的工作是主观的并且取决于几个因素。上面的代码不会抛出

NameError

© www.soinside.com 2019 - 2024. All rights reserved.