千家信息网

Python中强大的装饰器Decorators的工作原理

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,今天就跟大家聊聊有关Python中强大的装饰器Decorators的工作原理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这篇文章主要介绍 d
千家信息网最后更新 2026年10月31日Python中强大的装饰器Decorators的工作原理

今天就跟大家聊聊有关Python中强大的装饰器Decorators的工作原理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

这篇文章主要介绍 decorator(装饰器),在开始介绍 decorator 前,要先有一个观念,就是在 python 中,函数是对象,可以将它们分配给变量和传递给其他函数并从其他函数返回,可以在其他函数中定义函数,并且子功能可以捕获父功能的本地状态。

demo1.py

def f1():
print("f1")


def register(func):
func()


register(f1)

装饰器就是站在这个基础上去延伸出来的。接著来说说什麽时候要用装饰器,装饰器最主要的目的是在不破坏 function(函数) 或 class(类) 的情况下,去扩充目标 function 或 class 的功能。例如,logging、计算 function or class 执行的时间、权限等等。

如果大家有兴趣,可以再去查查 AOP ( Aspect Oriented Programming ),中文翻成 面向切面。

有了这个装饰器,我们就可以将大量的程式码抽出来( 与函数本身无关的部分 ),将这些 code 写到装饰器中 ( 可以重复使用 ),程式码也不会变得很乱。

说穿了,就是在现在的功能上,可以加上额外的功能 ( 重点是不破坏原有的 code )。

举个例子,今天我想要记录 f1() 的 logging,我们可能这样写,

( 正常来说,应该要使用 logging 这个 module,但这边简单用 print 代替就好 ????)

def f1():
print("f1")
print("logging - f1 is running")

f1()

这样写看似没有问题,但如果你今天 f2() f3() f4() 都需要纪录呢 ❓

这样要每一个都写一样的 code ❓

我们能不能把它抽出来 ❓ 而这个东西,就是专门处理 logging 的,

答案当然是可以的????

def my_logging(func):
print('logging - {} is running'.format(func.__name__))
func()


def f1():
print("f1")


my_logging(f1)

功能实现了,看似很美好,如果有其他的需要加上 logging,使用 my_logging(f2) 即可。但这方法其实有一些问题,问题点在每次都要呼叫 my_logging,而且也要将 f1 当成参数传递,比较好的方法应该是维持 f1 为主要业务逻辑,而不是像现在变成 my_logging 为主要业务逻辑,也就是说,现在的状况破坏了原有代码的结构。所以更好的方法,就是使用装饰器 ( 我们终于谈到主角了????),来看一个简单的装饰器。

def my_logging(func):
def wrapper():
print('logging - {} is running'.format(func.__name__))
func() # run func() Equivalent run f1()

return wrapper


def f1():
print("f1")


f1 = my_logging(f1) # Equivalent -> f1 = wrapper
f1() # Equivalent -> f1() = wrapper()

my_logging 就是一个装饰器,把真正的业务逻辑 func 包在里面,看起来就像是 func 被 my_logging 装饰了一样,所以顾名思义,称为装饰器。在这个范例中,函数的进入和退出时,都可以加上东西,这种方式也称为 AOP ( Aspect Oriented Programming )。接下来要来谈谈 @ 这个符号,你可以把他想成是一种语法的符号。

def my_logging(func):
def wrapper():
print('logging - {} is running'.format(func.__name__))
func() # run func() Equivalent run f1()

return wrapper


@my_logging
def f1():
print("f1")


f1()

当有了 @ 这个语法的帮忙,就可以将 f1 = my_logging(f1) 省略,直接使用 f1() 即可。

看完上述内容,你们对Python中强大的装饰器Decorators的工作原理有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

函数 功能 就是 业务 内容 逻辑 问题 强大 原理 工作 东西 方法 程式 符号 篇文章 语法 美好 顾名思义 接下来 主角 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 为想互联网科技怎么样 奇酷互联网络科技 科技创新互联网企业 唐信互联网科技 大连 米客互联网科技 狮子座互联网科技培训 上海电发互联网科技有限公司 北京华百购互联网科技有限公司 崇明区互联网教育科技诚信经营 佛山市拉法互联网科技有限公司 互联网金融科技名词解释 恒生互联网科技业指数调整周期 工业互联网展湾科技股份有限公司 工业互联网山东科技大学 国大互联网教育科技有限公司薪资 元气玛特互联网科技公司是外包吗 城市宝互联网科技有限公司 扫呗互联网科技有限公司 上海乐五互联网科技有限公司 深圳市人人互联网科技有限公司 互联网科技工作委员会副主任毛军 互联网电商科技 互联网和科技创新 互联网高科技股票 居家互联网科技有限公司 无锡溥仪互联网科技有限公司 风投北京互联网科技 互联网科技手抄报图片 互联网科技创业有什么好项目
0