Python装饰器详解:从开放封闭原则到实战应用

蓝鲸
蓝鲸
发布时间:2026-10-12| 3人浏览过
原创

本文深入解析Python装饰器,阐述其如何在不修改源码及调用方式的前提下扩展功能,遵循开放封闭原则。通过无参装饰器(如计时器)和有参装饰器(如认证逻辑)两个实例,展示装饰器的核心机制与代码实现,帮助开发者掌握这一高级特性。

Python函数式编程之装饰器

1.开放封闭原则

简单来说,就是对扩展开放,对修改封闭。

在面向对象或函数式编程中,系统由大量函数构成。函数的生命周期包含定义与调用两个阶段。一旦函数定义完成,它可能在系统的多个位置被反复调用。若直接修改已上线函数的源代码,将引发连锁反应,导致大量依赖该函数的模块出现异常,甚至造成系统崩溃。因此,现代软件开发强调:系统上线后,源代码原则上禁止直接修改。然而,随着用户规模增长,系统必须不断扩展新功能以适应用户需求。

这就引出了程序开发中的“开放封闭原则”:在无法修改原有源代码的前提下,如何为系统添加新功能?答案便是使用装饰器。

2.什么是装饰器

装饰器,顾名思义,是一种用于“装饰”或“修饰”其他对象的工具。

从技术定义来看,装饰器本身可以是任意可调用的对象(如函数、类),而被装饰的对象同样可以是任意可调用对象。

3.装饰器的作用

其核心作用在于:在不修改被装饰对象源代码,也不改变其调用方式的前提下,为被装饰对象添加新的功能。

原则:

1.不修改被装饰对象的源代码

2.不修改被装饰对象的调用方式

目标:

为被装饰对象添加新功能。

实例扩展:

import time
# 装饰器函数
def wrapper(func):
 def done(*args,**kwargs):
  start_time = time.time()
  func(*args,**kwargs)
  stop_time = time.time()
  print('the func run time is %s' % (stop_time - start_time))
 return done
# 被装饰函数1
@wrapper
def test1():
 time.sleep(1)
 print("in the test1")
# 被装饰函数2
@wrapper
def test2(name): #1.test2===>wrapper(test2) 2.test2(name)==dome(name)
 time.sleep(2)
 print("in the test2,the arg is %s"%name)
# 调用
test1()
test2("Hello World")

不含参数实例:

import time
user,passwd = 'admin','admin'
def auth(auth_type):
 print("auth func:",auth_type)
 def outer_wrapper(func):
  def wrapper(*args, **kwargs):
   print("wrapper func args:", *args, **kwargs)
   if auth_type == "local":
    username = input("Username:").strip()
    password = input("Password:").strip()
    if user == username and passwd == password:
     print("\033[32;1mUser has passed authentication\033[0m")
     res = func(*args, **kwargs) # from home
     print("---after authenticaion ")
     return res
    else:
     exit("\033[31;1mInvalid username or password\033[0m")
   elif auth_type == "ldap":
    print("ldap链接")
  return wrapper
 return outer_wrapper
@auth(auth_type="local") # home = wrapper()
def home():
 print("welcome to home page")
 return "from home"
@auth(auth_type="ldap")
def bbs():
 print("welcome to bbs page"
print(home()) #wrapper()
bbs()

到此这篇关于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 算法库。