Python中的@函数装饰器到底是什么?
在解释@函数装饰器之前,先说一下,类中的类方法和静态方法。
在Python中完全支持定义类方法、静态方法。这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以)。
区别在于:Python会自动绑定类方法的第一个参数,类方法的第一个参数会自动绑定到类本身;但对于静态方法则不会自动绑定。
类方法用@classmethod修饰,静态方法用@staticmethod修饰,如下:
1 #coding=utf-8 2 class Person: 3 @classmethod 4 def eat(cls): 5 print("类方法eat:",cls) 6 7 @staticmethod 8 def sleep(p): 9 print("静态方法sleep:",p) 10 11 12 Person.eat() 13 Person.sleep("info") 14 15 p = Person() 16 17 p.eat() 18 p.sleep('info')
控制台打印如下:
解释:eat方法因为是@classmethod修饰所以它是类方法,所以第12行调用时,不用传入任何参数,即可以调用,因为它会自动绑定类本身到第一个参数。
sleep方法因为是@staticmethod修饰所以它是静态方法,所以在第13行调用时,需要传入参数。再看17、18行,可以得出结论:不管是用类或者对象调用静态方法,Python都不会对静态方法的第一个参数进行自动绑定。
上面的@classmethod 和 @staticmethod 其实就是函数装饰器,其中classmethod和staticmethod为Python中内置的函数。
使用@符号引用已有函数后,可用于修饰其他函数。
例如@函数A 装饰 函数B ,实际完成的步骤为:
1.将被装饰的函数B作为参数传给函数A
2.将函数B替换为第1步的返回值。
举个例子:
1 def funA(fn): 2 """参数为一个函数对象""" 3 print('A') 4 fn() #执行传入的fn函数 5 return 'tizer' 6 7 ''' 8 下面的代码相当于funA(funB) 9 funB将会被替换为该语句的返回值 10 由于funA返回tizer,因此funB就是tizer 11 ''' 12 @funA 13 def funB(): 14 print('B') 15 print(funB)
先看运行结果:
解释:既然funB作为参数传给了funA,那就是得先执行funA中的代码,所以执行了print(‘A’),打印了A,然后执行第4行fn(),因为传入的funB,funB中的代码为print('B'),所以打印了B,然后funA 返回了一个字符串tizer,所以funB 等同于 tizer,第15行print(funB) 等同于 print('tizer'),所以打印了tizer。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?