@装饰器的用法

Python@装饰器的标准写法和原理
function_name函数先作为参数传入function_1函数中,运行function_1函数,打印数值1,并将function_3作为变量赋值给function_name,此时参数5并没有传入到function_1中,等返回function_3函数的时候传入参数值5,即:
function_name(5) == function_1(function_name)(5) == function_3(5)

注意:
1、参数5并没有传入到function_1中,等返回function_3函数的时候传入参数值5
2、如果定义为:def function_name(x,y)
则装饰器中:def function_3(x,y),两者的形式保持一致
3、装饰器同时装饰function_name(x)和newfunction_name(x,y),以上写法就无法满足要求了。因此为了让装饰器可以适用于更多的对象,返回值的形式可以写成def function_3(*n,**n):

def function_1(A):
    print("1") 
    #print(n) 如果运行这句话的话,报错:参数n没有被定义
    def function_3(*n)print(n)
        A(*n)
    return function_3


@function_1
def function_name(n):
    print(n+3)


function_name(5)

运行结果是:
1
(5,)
8

### Python装饰器概念 装饰器(Decorator)是在不修改原函数代码的前提下,用于扩展或更改函数行为的一种高级功能[^3]。通过使用`@decorator_name`语法糖,可以在目标函数定义前轻松应用装饰逻辑。 ### 基本结构与工作原理 一个简单的装饰器由接受待装饰函数作为参数的外部函数构成,内部则定义了一个嵌套函数来执行增强后的操作并返回该内层函数对象。当调用被装饰的方法时,实际上会触发这个新构建出来的闭包实例[^1]。 ```python def decorator_function(original_function): def wrapper_function(*args, **kwargs): # 支持任意数量的位置参数和关键字参数 print(f"Wrapper executed this before {original_function.__name__}") return original_function(*args, **kwargs) return wrapper_function @decorator_function def display(): print('display function ran') display() ``` 上述代码展示了如何创建以及运用基本形式的装饰器。这里先定义了名为`decorator_function()`的外层处理器,它接收要处理的目标方法;接着在其体内声明了另一个辅助性的`wrapper_function()`负责具体实施附加动作,并最终把后者当作结果反馈回去替代原始版本。 ### 实际应用场景举例说明 #### 斐波那契数列计算优化 利用带缓存特性的装饰器能够有效减少重复子问题求解次数从而提高效率: ```python from functools import lru_cache @lru_cache(maxsize=100) def fibonacci(n): if n < 2: return n else: return fibonacci(n-1) + fibonacci(n-2) print([fibonacci(i) for i in range(10)]) ``` 此案例中引入了标准库模块functools里的内置工具——LRU Cache (Least Recently Used),它可以自动记录最近访问过的输入值及其对应输出以便下次遇到相同请求时直接给出答案而不必重新运算整个流程。 #### 数据库连接管理 对于频繁涉及数据库交互的任务来说,借助于自定义装饰器可以帮助简化每次建立/断开链接的过程: ```python import mysql.connector as mc class MySQLConnection: def __init__(self, host='localhost', user=None, password=None, database=None): self.host = host self.user = user self.password = password self.database = database def connect(self): connection = mc.connect( host=self.host, user=self.user, passwd=self.password, db=self.database ) cursor = connection.cursor(dictionary=True) try: yield cursor finally: cursor.close() connection.commit() connection.close() db_config = {'host': 'example.com', 'user': 'root', 'password': '', 'database': ''} def use_db_connection(func): def inner(*args,**kwds): with MySQLConnection(**db_config).connect() as cur: func(cur,*args,**kwds) return inner @use_db_connection def query_data(cursor, table_name): sql = f'SELECT * FROM `{table_name}` LIMIT 5;' cursor.execute(sql) rows = cursor.fetchall() for row in rows: print(row) query_data('users') ``` 这段程序片段演示了怎样构造适用于MySQL环境下的持久化资源管理者类`MySQLConnection`,并通过专门设计好的`use_db_connection`装饰器实现了自动化控制生命周期的效果,使得开发者只需专注于编写核心业务部分即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值