Python在Class中实现装饰器

函数装饰器

普通的装饰器较为简单,关键点只有两个,一个是闭包的概念,一个是函数作为参数进行传递,让我们先实现一个简单的装饰器。

def huat(f):
    def func():
        print("welcome to huat!")
        f()
    return func

@huat
def method():
    print("hello world!")
    
if __name__ == '__main__':
    # Huat().run()
    method()

执行结果如下

welcome to huat!
hello world!

这里的装饰器无需传递参数,将装饰器函数种的闭包函数func作为一个参数进行返回即可。

方法装饰器

方法装饰器的实现和普通装饰器类似,我们先看一个不传递参数的例子

import time


def printTime(f):
    def x(self, *args, **kwargs):
        print("%s" % time.strftime("%X"))
        f(self, *args, **kwargs)
        return None
    return x


class Huat:
    @printTime
    def run(self):
        print("this's run.")


if __name__ == '__main__':
    Huat().run()

运行结果

15:41:10
this's run.

这里需要注意的地方是,在装饰器函数种的闭包func中,需要接收一个参数slef,然后在外部返回这个闭包函数即可。

带参数的方法装饰器

先来看一下代码

import time


def app(method: str):

    print(f"调用了{method}方法")

    def inner(func):
        def in_inner(self):
            print("%s" % time.strftime("%X"))
            func(self)
            return None
        return in_inner
    return inner


class Huat:
    @app(method="get")
    def run(self):
        print("this's run.")


if __name__ == '__main__':
    Huat().run()

运行结果

调用了get方法
16:11:13
this's run.

在装饰器函数有参数的情况下,被修饰的函数通过装饰器函数的闭包参数进行传递了,所以在闭包中的inner函数可以接收到被修饰函数run,所以多嵌套了一层闭包函数才能进行正常的装饰操作。

posted @ 2022-10-14 16:10  蠢蛋快跑  阅读(421)  评论(0)    收藏  举报