Python装饰器详解:从开放封闭原则到实战应用
本文深入解析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之装饰器简介内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













