Python新手学习装饰器

作者:爱喝马黛茶的安东尼 时间:2022-11-02 03:42:35 

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()

来源:https://www.py.cn/jishu/jichu/10769.html

标签:Python,装饰器
0
投稿

猜你喜欢

  • Mysql简易索引方案讲解

    2024-01-20 15:08:11
  • Go语言中JWT的创建和解析操作详解

    2024-05-09 10:09:22
  • 使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例

    2024-05-21 10:13:15
  • Javascript的闭包

    2024-04-19 09:48:38
  • Python实现的Excel文件读写类

    2022-03-15 19:43:24
  • Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】

    2022-06-01 04:19:02
  • Python如何通过手肘法实现k_means聚类详解

    2021-03-13 16:35:34
  • 基于python的docx模块处理word和WPS的docx格式文件方式

    2021-11-13 12:07:55
  • 图神经网络GNN算法基本原理详解

    2023-08-08 23:53:53
  • python单元测试unittest实例详解

    2023-10-16 08:26:49
  • Pandas之缺失数据的实现

    2022-05-04 19:00:05
  • PyTorch中的参数类torch.nn.Parameter()详解

    2021-09-07 19:06:30
  • Python numpy中的ndarray介绍

    2022-11-06 19:17:59
  • Python获取当前函数名称方法实例分享

    2023-12-22 01:16:57
  • 高效的MySQL分页

    2011-01-04 20:01:00
  • mysql 数据类型TIMESTAMP

    2024-01-17 17:04:57
  • Python完全识别验证码自动登录实例详解

    2023-12-17 03:58:14
  • Request.ServerVariables应用实例

    2008-03-11 11:57:00
  • 浅谈利用numpy对矩阵进行归一化处理的方法

    2021-10-12 01:22:41
  • Python第三方库的安装方法总结

    2022-09-23 12:14:46
  • asp之家 网络编程 m.aspxhome.com