Python修饰在“类.self”上修改的“类.方法”

pbpqsu0x  于 2023-02-17  发布在  Python
关注(0)|答案(1)|浏览(123)

如何访问修饰方法的self
基于this answer,self引用装饰器:

class Decorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(self.func.__name__)
        self.counter += 1
        return self.func(*args, **kwargs)

class A:
    def __init__(self):
        self.counter = 0
    @Decorator
    def method1(self):
        pass

上述示例将导致:

5 def __call__(self, *args, **kwargs):
----> 6     self.counter += 1
      7     return self.func(*args, **kwargs)

AttributeError: 'Decorator' object has no attribute 'counter'

注:
return self.func(*args, **kwargs)也出错了。我还不完全明白如何将其传递给A.method1。关键是我想更新计数器并打印self.func.__name__,仅此而已。

1tuwyuhd

1tuwyuhd1#

这里是一个带有类似函数的装饰器的例子,它可以被推广而不适用于其他情况。
提示:当使用类装饰器时,为另一个类的self使用另一个标识符,otherself,...

def dec(f):
    def __wrapper(self, *args, **kwargs):
        self.counter += 1
        self.c.append(f.__name__)
        return f(self, *args, **kwargs)
    return __wrapper

class A:
    def __init__(self):
        self.counter = 0
        self.c = []

    @dec
    def method1(self):
        pass

a = A()
a.method1()
a.method1()
print(a.counter, a.c)
2 ['method1', 'method1']

相关问题