python装饰器

百万年薪python之路 -- 装饰器

≯℡__Kan透↙ 提交于 2019-11-27 21:43:08
装饰器 1.1 开放封闭原则 开放封闭原则具体定义是这样: 1.对扩展是开放的 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。 2.对修改是封闭的 因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对函数内部进行修改,或者修改了函数的调用方式,很有可能影响其他已经在使用该函数的用户。 定义:在不改变原被装饰的函数的源代码以及调用方式下,为其添加额外的功能。 实现真正的开放封闭原则:装饰器。 运用闭包原理: import time def index(): time.sleep(2) # 模拟一下网络延迟以及代码的效率 print('这是一个主页') def access_index(name): time.sleep(3) # 模拟一下网络延迟以及代码的效率 print(f'欢迎访问{name}主页') 套一层最外面的函数timer,然后将里面的inner函数名作为最外面的函数的返回值 def timer(func): # func = index def inner(): start_time = time.time() func() end_time = time.time() print(f'此函数的执行效率为{end_time-start_time}') return

Python之内置装饰器property

淺唱寂寞╮ 提交于 2019-11-27 21:20:40
# -*- coding: utf-8 -*- # author:baoshan class Student(object): def __init__(self, name): self.name = name @property def age(self): return self._age @age.setter def age(self, value): if not isinstance(value, int): raise ValueError("输入不合法:年龄必须为数值!") if not 0 < value < 100: raise ValueError("输入不合法,年龄范围必须为0-100") self._age = value @age.deleter def age(self): del self._age xiaoming = Student('小明') xiaoming.age = 25 print(xiaoming.age) del xiaoming.age # 用@property装饰过的函数,会将一个函数定义成一个属性,属性的值就是该函数return的内容。 # 同时,会将这个函数变成另外一个装饰器。就像后面我们使用的@age.setter和@age.deleter。 # @age.setter 使得我们可以使用xiaoming.age =

python内置函数与闭包

拟墨画扇 提交于 2019-11-27 21:14:07
内置函数 I 了解 # all() any() bytes() callable() chr() complex() divmod() eval() exec() format() frozenset() globals() hash() help() # id() input() int() iter() locals() next() oct() ord() pow() repr() round() # eval 剥去字符串的外衣,返回里面的本质 # s1 = "{1: 'alex'}" # ret = eval(s1) # exec 代码流,过程。 # s3 = ''' # for i in range(3): # print(i) # ''' # exec(s3) # hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。 # print(hash(12322)) # help:函数用于查看函数或模块用途的详细说明。 # print(help(list)) # print(help(str.split)) # callable:函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败; # 但如果返回False,调用对象ojbect绝对不会成功。 # name = 'alex' # def func(): # pass

python装饰器与递归

落花浮王杯 提交于 2019-11-27 21:13:48
装饰器 开放封闭原则: 装饰器:装饰,装修,房子就可以住,如果装修,不影响你住,而且体验更加,让你生活中增加了很多功能:洗澡,看电视,沙发。 器:工具。 开放封闭原则: 开放:对代码的拓展开放的, 更新地图,加新枪,等等。 封闭:对源码的修改是封闭的。闪躲用q。就是一个功能,一个函数。 别人赤手空拳打你,用机枪扫你,扔雷.....这个功能不会改变。 装饰器:完全遵循开放封闭原则。 装饰器: 在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。 装饰器就是一个函数。 推导见代码 标准版的装饰器; 标准版的装饰器; def wrapper(f): f=zz #第2步 def inner(*args,**kwargs):#第5步 '''添加额外的功能:执行被装饰函数之前的操作'''#第6步 ret = f(*args,**kwargs)#第7步 ''''添加额外的功能:执行被装饰函数之后的操作'''#第8步 return ret return inner #第3步 @weapper# zz=weapper(zz) 第一步 def zz()#第4步 此时zz 为 inner pass 带参数的装饰器 def wrapper_out(n,*args,sex="男") def wrapper(f): def inner(*args,**kwargs): ret = f(*args,*

Python装饰器之functools.wraps的作用

谁都会走 提交于 2019-11-27 20:49:24
# -*- coding: utf-8 -*- # author:baoshan def wrapper(func): def inner_function(): pass return inner_function @wrapper def wrapped(): pass print(wrapped.__name__) # inner_function def wrapped2(): pass print(wrapper(wrapped2).__name__) # inner_function # 为了避免上述情况的产生,方法是使用functools.wraps装饰器, # 它的作用就是被修饰的函数(wrapped)的一些属性值赋值给修饰器函数(wrapper), # 最终让属性的显示更符合我们的直觉。 from functools import wraps def wrapper2(func): @wraps(func) def inner_function(): pass return inner_function @wrapper2 def wrapped3(): pass print(wrapped3.__name__)# wrapped3 Python装饰器之functools.wraps的作用,就是给被修饰的函数的一些属性值赋值给修饰器函数。 谢谢! 来源:

Python测开面试题之装饰器

孤者浪人 提交于 2019-11-27 20:42:43
Python的装饰器是面试常被问到的问题之一,在面试Python测试开发时被问到的概率不低于70%,那么装饰器的原理是什么,怎么快速写出一个装饰器呢,接下来我们详细讲解装饰器的实现方法。 Python是一门动态语言,语法十分灵活多变,我们可以定义一个计算两数之和的加法函数,代码如下: defadd(x, y) returnx + y 函数实现非常简单,输入两个参数,计算两个参数的和。我们可以直接调用函数 sum= add(3,5) print(sum) 也可以讲函数复制给一个变量,然后通过变量调用函数 sum= add sum(3,5) 此时sum不再是add函数的结果,而是add函数自身,因此可以被调用并且传入参数3,5 既然函数可以作为参数,那么函数当然也可以作为返回值,我们来实现一个嵌套函数来对add函数的两个参数进行校验👇🏻 defdecorator(func): defwrapper(x, y): try: _x = float(x) exceptException: _x =0 try: _y = float(x) exceptException: _y =0 sum = func(_x, _y) returnsum returnwrapper 由代码看出wrapper函数作为decorator函数的返回值返回

创建虚拟环境,以方便管理

我们两清 提交于 2019-11-27 17:54:46
目录 一、计算机基础 二、Python基础 三、函数 四、常用模块 五、模块和包 六、面向对象 七、网络编程socket 八、数据库 九、前端 十、Python Web框架 十一、版本控制--GIT 十二、爬虫 十三、前端框架之VUE 十四、量化投资与Python 十五、算法 十六、设计模式 十七、restful framework 十八、linux基础 十九、权限管理 一、计算机基础 计算机基础知识 计算机的发展史及多道技术 计算机网路知识的简单介绍 二、Python基础 Python学习【第0篇】:window环境下安装Python2和Python3   Python学习【第1篇】:Python简介以及入门 Python学习【第2篇】:Python之数据类型 Python学习【补充篇】:Python之字符串切片 Python学习【第3篇】:Python之运算符 Python学习【第4篇】:Python之可变数据类型与不可变数据类型 Python学习【第5篇】:Python之字符编码问题 Python学习【第6篇】:Python之文件操作 Python学习【补充篇】:map函数和reduce函数的区别 三、Python之函数 Python学习【第7篇】:Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) Python学习【第7篇】:Python之函数(参数的介绍)

Python进阶-III 函数装饰器(Wrapper)

瘦欲@ 提交于 2019-11-27 16:40:59
1、引入场景: 检查代码的运行时间 import time def func(): start = time.time() time.sleep(0.12) print('看看我运行了多长时间!') end = time.time() print('此段代码运行时长为:%s'%(end - start)) func() 如果有大量的函数要检查,这样加入代码太费功夫!考虑提取为一个函数,要检查时直接调用即可 def check_time(f): start = time.time() time.sleep(0.12) f() end = time.time() print('此段代码运行时长为:%s' % (end - start)) check_time(func) 还是有问题,有人嫌每次都去调用该函数很麻烦!能不能,在不修改要测试远行时长的函数的调用方式前提下,还想在原来的函数前后添加测试时长功能? def timing(f): # 装饰器函数 def inner(): start = time.time() time.sleep(0.12) f() # 被装饰函数 end = time.time() print('此段代码运行时长为:%s' % (end - start)) return inner func = timing(func) func()

浅析python中@装饰器的作用

£可爱£侵袭症+ 提交于 2019-11-27 16:06:36
要了解python中@装饰器的作用,首先要记住这么几点: 装饰器符号“@”属于语法糖,什么意思呢?就是说,我不按照@装饰器的语法要求来写,而是按照一般python的语法要求来写完全可以。那么用@装饰器的格式来写的目的就是为了书写简单方便 装饰器的作用是什么呢? 简单的理解就是:装饰原有的函数。什么意思呢?比如有一个函数func(a, b),它的功能是求a,b的差值,我现在有一个需求,就是想对函数功能再装饰下,求完差值后再取绝对值,但是不能在func函数内部实现,这时候就需要装饰器函数了,比如func = decorate(func)函数,将func函数作为参数传递给decorate函数,由decorate来丰富func函数,丰富完成后再返回给func,此时func的功能就丰富了。 3.python的常识,函数和其他任何东西一样,都是对象。这意味着可以将函数当做实参传递给函数,或者在函数中将函数作为返回值返回。例码验证: >> > def add ( x , y ) : . . . return x + y >> > def sub ( x , y ) : . . . return x - y >> > def apply ( func , x , y ) : # 1 . . . return func ( x , y ) # 2 >> > apply ( add , 2 , 1 )

Python装饰器完全解读

时光怂恿深爱的人放手 提交于 2019-11-27 15:57:41
1 引言 装饰器(Decorators)可能是Python中最难掌握的概念之一了,也是最具Pythonic特色的技巧,深入理解并应用装饰器,你会更加感慨——人生苦短,我用Python。 2 初步理解装饰器 2.1 什么是装饰器 在解释什么是装饰器之前,我们有必要回顾一下Python中的一些思想和概念。我们都知道,Python是一门面向对象的语言,Python基本思想就是一些皆对象,数据类型是对象、类是对象、类实例也是对象……对于接下来我们要说的装饰器而言,最重要的是,函数也是对象! 你没看错,函数也和数据类型等概念一样,都是对象,那么既然数据类型可以进行赋值操作,那么函数是不是也可以赋值呢?当然可以! def do_something(): print('完成一些功能') if __name__ == '__main__': do = do_something do() 输出: 完成一些功能 看,原本我们定义的函数名是do_something,但我们把函数赋值给do后,也可以通过do()调用函数。不仅如此,函数当做参数传递给其他函数: def do_something(): print('正在完成功能') def func(f): f() if __name__ == '__main__': func(do_something) 输出: 完成一些功能