类方法和函数的装饰器

joj*_*w85 5 python decorator

我有一个装饰师

def deco(func):
    def inner(params):
        #< DO STUFF WITH func >
    return inner
Run Code Online (Sandbox Code Playgroud)

和一个基类

class GenericClass:
    def __init__(self,value):
        self.value = value
    def method(self,params):
        print 'NOT IMPLEMENTED YET'
    def other_method(self):
        print 'GOOD TO GO'
Run Code Online (Sandbox Code Playgroud)

我希望能够在 GenericClass 的子类上装饰“method”方法,例如检查输入/输出或处理异常(方法“method”将被覆盖)

我想做的是...

class ChildClass(GenericClass):
    @deco
    def method(self,params):
        #< NEW METHOD >
Run Code Online (Sandbox Code Playgroud)

我不是专家Python开发人员,该级别的所有文档都非常混乱(即元类、装饰器的微妙之处、__call__方法等),而且我没有找到解决方案。

Gri*_*ief 6

知道了。您基本上是在问如何编写一个可以应用于函数和方法的装饰器。这是可能的:

def deco(func):
    def inner(*args):
        print('DECORATED: args={}'.format(args))
        func(*args)
    return inner

class Class:
    @deco
    def method(self, param): print('PARAM is {}'.format(param))

@deco
def func(a, b, c): print('{} {} {}'.format(a, b, c))

Class().method('X')

func(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

输出:

DECORATED: args=(<__main__.Class instance at 0x7f740c6297a0>, 'X')
PARAM is X
DECORATED: args=(1, 2, 3)
1 2 3
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

一年后,我在这里发现了一篇有用的帖子(8年前就有人问过):Using the samedecorator(witharguments)withfunctionsandmethods。如果您关心修饰函数的实际参数,那么那里描述的方法将会很有用。