'''
开放封闭原则:
软件一旦上线之后就应该满足开放封闭原则
具体就是指对修改是封闭的,对扩展是开放的
装饰器:
什么是装饰器:装饰就是修饰,器指的是工具
装饰器本省可以是任意可调用的对象
被装饰的对象也可以是任意可以被调用的对象 装饰器====》可以是一个函数
被装饰对象====》也可以是一个函数
装饰器就是用来为被装饰对象修改添加新功能的一种工具
必须遵循两个原则:
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. WebSocket的Tomcat实现

    一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通 ...

  2. 查看百度CUID方法

    百度地图CUID号获取方法:安卓系统百度地图APP→“设置”→ 长按“关于”

  3. python3类方法与静态方法

    静态⽅法和类⽅法 转载于:https://blog.csdn.net/qq_41020281/article/details/79634707 1. 类⽅法 是类对象所拥有的⽅法,需要⽤修饰器 @cl ...

  4. css实现连续数字和英文的自动换行的方法

    1.(IE浏览器)连续的英文字符和阿拉伯数字,使用word-wrap : break-word ;或者word-break:break-all;实现强制断行 #wrap{word-break:brea ...

  5. Java虚拟机----垃圾回收与内存分配

    一.垃圾回收的对象: 在Java的运行时数据区中,程序计数器和虚拟机栈.本地方法栈是随着线程的生灭而生灭,栈当中栈帧的大小在编译的时候已知,在方法结束之后栈帧出栈,这部分的垃圾回收是明确的,因此需要讨 ...

  6. jq冲刺

    1.入口函数$(document).ready(function(){ })简便写法:$(()=>{ }) js的入口函数window.onload()区别js的入口函数要比jq的要晚很多,wi ...

  7. __x__(8)0906第三天__乱码问题

    需要知道: 计算机只认 0 1 任何内容,计算机都会以 0 1 去存储 所以 0 1 与内容的编码方式/解码方式需要依照一定的规则,实现 0 1 与内容之间的转换. 字符集:一定的规则,由编码/解码采 ...

  8. FloatingActionButton的使用

  9. CentOS6.5yum配置本地源

    进入repos.d目录 cd /etc/yum.repos.d 创建临时文件夹repo.bak(文件夹名随意起 使用root权限) 将以下文件移到repo.bak文件夹(以防备用) -rw-r--r- ...

  10. python联系-迭代器

    from collections import Iterable from collections import Iterator import time class Classmate(object ...