Python 类能否写类方法中的类装饰器?

class A:

    def fun_A(self):
        ....

    def fun_B(self):
        ...
  • 方法 B 怎么使用方法 A 作为装饰器呢?
class A:

    def fun_A(self):
        ....

    @A.fun_A
    def fun_B(self):
        ...
  • 这样貌似不行,该如何解决
阅读 2.6k
3 个回答

两种思路:
1.将fun_A定义为一个静态方法,并使用该静态方法作为装饰器。

class A:
    @staticmethod
    def fun_A(func):
        ...

    @fun_A
    def fun_B(self):
        ...

2.将fun_A定义为一个装饰器函数,并在类的外部使用该装饰器对fun_B进行装饰。

def fun_A(func):
    ...

class A:
    @fun_A
    def fun_B(self):
        ...
class A:

    some_state = "Hello, world!"

    @classmethod
    def fun_A(cls, func):
        def wrapper(*args, **kwargs):
            print("Before calling function")
            print("Class state is:", cls.some_state)
            result = func(*args, **kwargs)
            print("After calling function")
            return result
        return wrapper

    @fun_A
    def fun_B(self):
        print("Inside function B")
#!usr/bin/python
# *- coding:utf8 -*-

class A:
    def __init__(self, name):
        self.name = name

    def wrapper(func):
        def inner(*args, **kwargs):
            return func(*args, **kwargs) + " hello!"

        return inner

    @wrapper
    def say_hello(self, lastname):
        return self.name + ' ' + lastname

    def __call__(self, *args, **kwargs):
        return "test"


if __name__ == '__main__':
    a = A(name="sampson")
    print(a.say_hello("clarence"))
    print(a.wrapper()())

建议不要这样做, a.wrapper()()的时候这时候A object必须callable

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题