python - 如何使用类实例变量作为 Python 中方法装饰器的参数?

标签 python decorator

如何在 Python 中使用类实例变量作为方法装饰器的参数? 以下是一个最小的示例,显示了我正在尝试做的事情。它显然失败了,因为装饰器函数无法访问对实例的引用,而且我不知道如何从装饰器访问引用。

def decorator1(arg1):
    def wrapper(function):
        print "decorator argument: %s" % arg1
        return function
    return wrapper

class Foo(object):
    def __init__(self, arg1):
        self.var1 = arg1

    @decorator1(self.var1)
    def method1(self):
        print "method1"

foo = Foo("abc")
foo.method1()

最佳答案

这是行不通的;装饰器在类创建期间被调用,这在创建实例之前很久(如果曾经发生过)。因此,如果您的“装饰器”需要实例,则必须在实例化时进行“装饰”:

def get_decorator(arg1):
    def my_decorator(function):
        print "get_decorator argument: %s" % arg1
        return function
    return my_decorator

class Foo(object):
    def __init__(self, arg1):
        self.var1 = arg1
        self.method1 = get_decorator(self.var1)(self.method1)

    def method1(self):
        print "method1"

foo = Foo("abc")
foo.method1()

请注意,我根据它们的含义更改了函数名称;实际的“装饰器”,即(可能)修改方法的函数,在您的情况下是 wrapper,而不是 decorator1

关于python - 如何使用类实例变量作为 Python 中方法装饰器的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1231950/

相关文章:

Scala 中的 Python 风格装饰器

Python:装饰一个旨在在继承时被覆盖的类方法

python - 计算两行之间的时间差

python - PostgreSQL COPY SQL 注入(inject)

python - ValueError : Dimensions must be equal, 但对于 '{{node mean_squared_error/SquaredDifference}} = SquaredDifference[T=DT_FLOAT] 是 68 和 10

python - 装饰类继承和类方法

wrapper - tcl:包装一个同名的proc

python - 测试 Python 装饰器?

python - 将两个 panda 数据帧相乘以重复数据一定次数

Python 递归维护键控深度