Python装饰器原理与用法深度解析

周予安
周予安
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python装饰器的核心原理,阐述其作为函数本质及不修改源码和调用方式的两大原则。通过解析变量与函数的内存存储机制,结合高阶函数与嵌套函数的知识,详细演示了基础装饰器、带参装饰器的实现逻辑及代码运行流程,帮助开发者掌握装饰器的实际应用。

本文通过具体实例详细解析Python装饰器的核心原理与使用方法,旨在为读者提供清晰的参考指南。

装饰器的本质是一个函数,其核心作用在于修饰其他函数,从而为被装饰的函数增加额外的功能。

在使用装饰器时,需遵循以下两个基本原则:

首先,装饰器不得修改被装饰函数的原始源代码。

其次,装饰器不得改变被装饰函数的原有调用方式。

要深入理解并实现装饰器,需掌握以下关键知识点:

在Python中,函数被视为一种特殊的变量。

为了深入理解这一概念,我们需要分析变量在Python中的存储机制。

x='Tomwenxing'
y=x

具体说明如下:

当Python解释器执行语句x='Tomwenxing'时,主要完成两项操作:

第一,在内存中开辟一块空间用于存储字符串'Tomwenxing'。

第二,在内存中创建一个名为x的变量,使其指向存储字符串'Tomwenxing'的内存空间(这类似于房间与房间号的对应关系)。

而语句y=x的含义是将变量x对字符串的引用赋值给变量y,即在内存中创建变量y,并使其指向变量x所指向的同一内存空间。

接下来分析函数在Python中的存储方式。

def test():
  pass

具体说明如下:

在Python中,函数的存储机制与变量相似。以上述函数为例,Python解释器主要执行以下操作:

第一,在内存中开辟一块空间,用于存储函数代码的字符串(本例中代码仅包含一句:pass)。

第二,在内存中创建一个名为test的变量,用于指向存储函数代码字符串的内存空间(相当于执行test='函数体')。

因此,在Python中可以说函数即变量。

第二点知识储备是高阶函数(满足以下任一条件即视为高阶函数):

a、将一个函数名作为实参传递给另一个函数。

[对装饰器的影响]:实现了“在不修改被装饰函数源代码的前提下为其添加功能”的效果。

import time
def bar():
  time.sleep(2)
  print('in the bar')
def test(func):
  start_time=time.time()
  func()
  stop_time=time.time()
  print('函数的运行时间为:',stop_time-start_time)
test(bar)

运行结果示例如下:

in the bar 函数的运行时间为: 2.0021145343780518

b、返回值中包含函数名。

[对装饰器的影响]:实现了“不改变函数的调用方式”的效果。

import time
def bar():
  time.sleep(3)
  print('in the bar')
def test2(func):
  print('新添加的功能')
  return func
bar=test2(bar)
bar()

运行结果示例如下:

新添加的功能 in the bar

第三点知识储备是嵌套函数:在一个函数体内使用def声明一个新的函数(注意:这是声明而非调用)。

def foo():
  print('in the foo')
  def bar(): #声明一个新的函数,而不是调用函数
    print('in the bar')
  bar()
foo()

运行结果示例如下:

in the foo in the bar

第四点,装饰器的语法结构为:高阶函数 + 嵌套函数 = 装饰器(建议读者使用pycharm的调试器跟踪代码运行顺序以加深理解)。

import time
def timer(func):
  def deco(*args,**kwargs):#使用了不定参数
    start_time=time.time()
    res=func(*args,**kwargs) #运行函数
    stop_time=time.time()
    print('运行时间:',stop_time-start_time)
    return res # 若无返回值,则返回None
  return deco
@timer #等价于test1=timer(test1)=deco,即test1()=deco()
def test1():
  time.sleep(3)
  print('in the test1')
@timer #等价于test2=timer(test2)=deco,即test2(name)=deco(name)
def test2(name):
  time.sleep(3)
  print('in the test2',name)
test1()
print('-------------分界线------------------------')
test2('Tomwenxing')

运行结果示例如下:

in the test1 运行时间: 3.0001718997955322 -------------分界线------------------------ in the test2 Tomwenxing 运行时间: 3.000171422958374

第五点,介绍带参数的装饰器。

# -*- coding:utf-8 -*-
user,passwd='Tomwenxing','123'
#如装饰器带参数,一般是三层嵌套
def auth(auth_type): #第一层的参数是装饰器的参数
  def outer_wrapper(func):#第二层的参数是装饰器要装饰的目标函数
    def wrapper(*args,**kwargs):#第三次的参数是目标函数的参数
      if auth_type=='local':
        username = input('Username:').strip()
        password = input('Password:').strip()
        if user == username and passwd == password:
          print('用户Tomwenxing已经成功登录!')
          res = func(*args, **kwargs) #运行目标函数
          return res
        else:
          exit('用户名或密码有错误')
      elif auth_type=='ldap':
        print('暂不支持这种登录方式!')
    return wrapper
  return outer_wrapper
def index():
  print('欢迎来到index页面')
@auth(auth_type='local') #home=wrapper()
def home(name):
  print('%s,欢迎来到home页面' %name)
  return 'This is home page'
@auth(auth_type='ldap')
def bbs():
  print('欢迎来到bbs页面 ')
index()
print('----------------------分界线-------------------')
print('函数的返回值为:',home('wenxing'))
print('----------------------分界线-------------------')
bbs()

运行结果示例如下:

欢迎来到index页面 ----------------------分界线------------------- Username:Tomwenxing Password:123 用户Tomwenxing已经成功登录! wenxing,欢迎来到home页面 函数的返回值为: This is home page ----------------------分界线------------------- 暂不支持这种登录方式!

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。