'''
开放封闭原则:
软件一旦上线之后就应该满足开放封闭原则
具体就是指对修改是封闭的,对扩展是开放的
装饰器:
什么是装饰器:装饰就是修饰,器指的是工具
装饰器本省可以是任意可调用的对象
被装饰的对象也可以是任意可以被调用的对象 装饰器====》可以是一个函数
被装饰对象====》也可以是一个函数
装饰器就是用来为被装饰对象修改添加新功能的一种工具
必须遵循两个原则:
1,不能修改被装饰对象的源代码
2,不能修改被装饰对象的调用方式 ###简单版本的装饰器:这种简单的装饰器只适用于没有参数没有返回值的情况
'''
import time
'''
def indes():
start_time = time.time()
time.sleep(1)
print('welcome to index')
end_time = time.time()
print('runtime is %s' %(end_time-start_time))
#
# # indes()
# def wrapper(func):
# start_time = time.time()
# func()
# end_time = time.time()
# run_time = end_time-start_time
# print(run_time)
# # wrapper(indes)
# def home():
# pass
# # wrapper(home)
#
def outer(func):
# func = indes
def wrapper():
start_time = time.time()
func()
end_time = time.time()
run_time = end_time-start_time
print(run_time)
return wrapper
indes = outer(indes)####f = wrapper
res = indes()
print(res)
'''
# print('='*100)
# def outer():
# def wrapper():
# start_time = time.time()
# return 123
# print("hello world")
# end_time = time.time()
# print('运行时间是%s' %(end_time - start_time))
# return wrapper
# res = outer()
# print(res())
###装饰器进阶版:
'''
import time
def home(name):
time.sleep(2)
print("welcome to home page")
return 1234 def timmer(func):
def inner(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print('运行时间是%s' %(end_time - start_time))
return res
return inner home = timmer(home)
home('egon')
'''
'''
装饰器语法糖:
在被装饰对象正上方单独一行写:
@装饰器的名字 意思也就是: 被装饰对象 = 装饰器的名字(被装饰对象)
注意:新定义的装饰器函数必须放在要装饰的函数的上方,也就是给要装饰的函数带个帽子 最终的版本是:
'''
'''
import time def timmer(func):####装饰器函数
def inner(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print('运行时间是%s' %(end_time - start_time))
return res
return inner
@timmer
###被装饰的对象
def home(name):
time.sleep(2)
print("welcome to home page")
return 1234 # home = timmer(home)
home('egon')
'''
'''
import time def outer(func):
def wrapper(*args,**kwargs):####这里的参数情况要和被装饰的对象一致
user_name = input('please input user name =====>')
pwd = input('please input pass word======>')
if user_name =='egon' and pwd == '123':
res = func(*args,**kwargs)
return res
return wrapper
@outer
def index():
time.sleep(1)
print('welcome to index page ')
return 1234 def home(name):
time.sleep(2)
print('welcome %s to home page ' %name ) index()
'''
####有参装饰器
##有带参数的装饰器,这个是最高难度的,一般也只需要像这样套三层。
import time
def anth(engine = 'file'):###默认参数设置为file
def outer(func):
def wrapper(*args,**kwargs):####这里的参数情况要和被装饰的对象一致
user_name = input('please input user name =====>')
pwd = input('please input pass word======>')
if engine == 'file':
if user_name =='egon' and pwd == '123':
res = func(*args,**kwargs)
return res
elif engine =='mysql':
print("基于mysql的认证")
elif engine == 'ldap':
print('基于lasp的认证') return wrapper
return outer
ot = anth(engine = 'mysql')
@ot
def index():
time.sleep(1)
print('welcome to index page ')
return 1234 def home(name):
time.sleep(2)
print('welcome %s to home page ' %name ) index()

PYTHON装饰器用法及演变的更多相关文章

  1. Python装饰器用法

    在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...

  2. python装饰器@用法

    这个是我见过比较好的讲解链接: [廖雪峰的官方网站 - 装饰器]

  3. Python装饰器的另类用法

    之前有比较系统介绍过Python的装饰器(请查阅<详解Python装饰器>),本文算是一个补充.今天我们一起探讨一下装饰器的另类用法. 语法回顾 开始之前我们再将Python装饰器的语法回 ...

  4. Python装饰器的高级用法(翻译)

    原文地址 https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function 介绍 我写这篇 ...

  5. Python学习第四十天函数的装饰器用法

    在软件开发的过程中,要遵循软件的一些原则封装的,不改变原有的代码的基础增加一些需求,python提供了装饰器来扩展函数功能,下面说说函数装饰器用法 def debug(func):      def ...

  6. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  7. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  8. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

  9. [转]python 装饰器

    以前你有没有这样一段经历:很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这样的话是不是还要大体读读 ...

随机推荐

  1. 反素数ant HYSBZ - 1053(数学+dfs)

    对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x为反质数.例如,整数1,2,4,6等都是反质 ...

  2. [wordpress]WordPress地址(URL)错误,修改解决方案

    本人在修改Wordpress地址(URL)时,误操作使URL指向错误,后台无法进入. 解决方案 1.先利用Putty登陆到自己的服务器上(这里登陆方法我不再赘述): 2.登陆MySqL,并输入密码: ...

  3. C#细说多线程

    引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发.其中委托的BeginInvoke方法以及回调函数最为常用.而 I/O线程可能 ...

  4. SpringBoot使用Nacos服务发现

    本文介绍SpringBoot应用使用Nacos服务发现. 上一篇文章介绍了SpringBoot使用Nacos做配置中心,本文介绍SpringBoot使用Nacos做服务发现. 1.Eureka闭源 相 ...

  5. (三)ajax请求不同源之nginx反向代理跨域

    一.基本原理 nginx是一个高性能的web服务器,常用作反向代理服务器.nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上. 用nginx反向代理实现跨域,是最简单的跨域方 ...

  6. weblogic10.3 启动报错 Unrecognized option: -jrockit Error: Could not create the Java Virtual Machine

    今天在使用weblogic10.3+jdk7创建domain的时候,建好domain后启动报如下错误信息: Unrecognized option: -jrockitError: Could not ...

  7. __x__(29)0908第五天__高度塌陷 问题

    高度塌陷 在文档流中,父元素的高度默认是被子元素撑开的. 但是当为 子元素 设置 float 时,子元素会完全脱离文档流,无法再撑开父元素,导致父元素高度塌陷...以致于布局混乱 变成 BFC块级格式 ...

  8. 08_ for 练习 _ sumOf7

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. BOM 浏览器对象模型_不超过 4 KB 的 document.cookie 对象

    注意: 客户端储存应该使用 Web storage API 和 IndexedDB,不推荐使用 Cookie document.cookie 对象 是服务器保存在浏览器的一小段文本信息 用于读写当前网 ...

  10. 【搜索1】P1605 迷宫

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...