Python高级用法合集

装饰器(decorator)

Intro

Python的装饰器就是一个函数或者类,其主要目的是用于在不修改函数或者类代码的情况下,给它们增加额外的功能。它本质上是一个用于包装另一个函数或类的函数。

Function

装饰器通常用于代码复用、日志记录、访问控制、性能测试、缓存等场景。

Practice

装饰器函数:

1、记录函数执行时间的装饰器

import time
def runtime(fun):
    def wrapper(*args, **kwargs):
        print(f"{fun.__name__} staring !!!")
        start = time.perf_counter()
        res = fun(*args, **kwargs)
        end = time.perf_counter()
        print(f"{fun.__name__} finished !!!")
        print(f"{(end - start)*1000} ms ")
        return res
    return wrapper

@runtime
def add(a, b):
    return a + b

add(2,3)

2、日志记录器Logger

class Logger:  
    def __init__(self,func,message="Executing"):  
        self.func = func  
        self.message = message  
    def __call__(self,*args, **kwargs):  
        print(f"{self.message}: {self.func.__name__}")  
        return self.func(*args, **kwargs)  
@Logger  
def add(a,b):  
    return a+b  
  
@Logger(message="Add")  
def subtract(a,b):  
    return a-b  
  
print(add(10,20))  
print(subtract(10,20))

运行报错:

@Logger(message="Add")
     ^^^^^^^^^^^^^^^^^^^^^
TypeError: Logger.__init__() missing 1 required positional argument: 'func'

原因在于,使用类装饰器的话,会把函数默认当作第一个参数传递给类装饰器,所以print(add(10,20))这一句没有报错,print(subtract(10,20))会少一个参数。

解决的办法是想办法在把函数作为参数给类装饰器之前传入自定义参数:

方法一:加入一层外部装饰器接受参数

class Logger:  
    def __init__(self,func,message="Executing"):  
        self.func = func  
        self.message = message  
    def __call__(self,*args, **kwargs):  
        print(f"{self.message}: {self.func.__name__}")  
        return self.func(*args, **kwargs)  
  
def logger_param(message="Executing"):  
    def wrapper(func):  
        return Logger(func,message=message)  
    return wrapper  
@Logger  
def add(a,b):  
    return a+b  
  
@logger_param(message="Add")  
def subtract(a,b):  
    return a-b  
  
print(add(10,20))  
print(subtract(10,20))

方法二:@Logger() 这里一定要加括号,原理可以自己思考一下

class Logger:  
    def __init__(self,message="Executing"):  
        self.message = message  
    def __call__(self,func):  
        def wrapper(*args,**kwargs):  
            print(f"{self.message}: {func.__name__}")  
            return func(*args,**kwargs)  
        return wrapper  
@Logger()  
def add(a,b):  
    return a+b  
  
@Logger(message="Running function:")  
def subtract(a,b):  
    return a-b  
  
print(add(10,20))  
print(subtract(10,20))


Python高级用法合集
http://localhost:8091/archives/pythongao-ji-yong-fa-he-ji
作者
BroAlanTaps
发布于
2024年09月17日
更新于
2024年09月17日
许可协议