python装饰器

Python3(十二) Pythonic与Python杂记

隐身守侯 提交于 2020-02-13 20:10:03
一.用字典映射代替switch case语句 if/else可以代替switch但是非常不合适。 用字典代替switch: day = 5 switcher = { 0:'Sunday', 1:'Monday', 2:'Tuesday' } day_name = switcher.get(day,'Unknow') print(day_name) 利用get()完整模拟。 在字典中模拟带函数的switch: day = 6 def get_sunday(): return 'Sunday' def get_monday(): return 'Monday' def get_tuesday(): return 'Tuesday' def get_default(): return 'Unknow' switcher = { 0:get_sunday, 1:get_monday, 2:get_tuesday } day_name = switcher.get(day,get_default)() print(day_name) 二.列表推导式 根据已经存在的列表创建新的列表: a = [1,2,3,4,5,6,7,8] b = [i * i for i in a] print(b) #[1, 4, 9, 16, 25, 36, 49, 64] 或者i**2也事代表i的平方。 条件筛选

python编程系列---多个装饰器装饰一个函数的执行流程

喜夏-厌秋 提交于 2020-02-13 18:06:50
首先看一个例子 1 ''' 多个装饰器装饰一个函数 ''' 2 3 # 定义第一个装饰器 4 def set_func1(func): 5 def wrapper1(*args,**kwargs): 6 print('装饰内容开始1') 7 func(*args, **kwargs) 8 print('装饰内容结束1') 9 return wrapper1 10 11 12 # 定义第二个装饰器 13 def set_func2(func): 14 def wrapper2(*args,**kwargs): 15 print('装饰内容开始2') 16 func(*args, **kwargs) 17 print('装饰内容结束2') 18 return wrapper2 19 20 # 定义第二个装饰器 21 def set_func3(func): 22 def wrapper3(*args,**kwargs): 23 print('装饰内容开始3') 24 func(*args, **kwargs) 25 print('装饰内容结束3') 26 return wrapper3 27 28 29 30 31 @set_func1 32 @set_func2 33 @set_func3 34 def show(): 35 print('Show Run....') 36 37

国内某Python大神自创完整版,系统性学习Python

情到浓时终转凉″ 提交于 2020-02-13 13:43:54
很多小伙伴纠结于这个一百天的时间,我觉得完全没有必要,也违背了我最初放这个大纲上来的初衷,我是觉得这个学习大纲还不错,自学按照这个来也能相对系统的学习知识,而不是零散细碎的知识最后无法整合,每个人的基础以及学习进度都不一样,没有必要纠结于一百天这个时间,甭管你是用三个月还是用一年来学习这些东西,最后学到了不就是收获吗?何必纠结于这一百天,觉得这一百天学习不完我就放弃了呢?(另,项目后面没有更新完,大家可以按照这个框架去学习,没有更新完的大家可以自行找资料。) PS:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步 给初学者的几个建议: Make English as your working language. Practice makes perfect. All experience comes from mistakes. Don’t be one of the leeches. Either stand out or kicked out.

python中的property装饰器

牧云@^-^@ 提交于 2020-02-12 18:58:37
既要保护类的封装特性,又要让开发者可以使用“对象.属性”的方式操作操作类属性,除了使用 property() 函数, Python 还提供了 @property 装饰器。通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。 @property 的语法格式如下: @property def 方法名(self) 代码块 例如,定义一个矩形类,并定义用 @property 修饰的方法操作类中的 area 私有属性,代码如下: class Rect: def __init__(self,area): self.__area = area @property def area(self): return self.__area rect = Rect(30) #直接通过方法名来访问 area 方法 print("矩形的面积是:",rect.area) 运行结果为: 矩形的面积为: 30 上面程序中,使用 @property 修饰了 area() 方法,这样就使得该方法变成了 area 属性的 getter 方法。需要注意的是,如果类中只包含该方法,那么 area 属性将是一个只读属性。 也就是说,在使用 Rect 类时,无法对 area 属性重新赋值,即运行如下代码会报错: rect.area = 90 print("修改后的面积:"

Python开发【第四章】:函数剖析

耗尽温柔 提交于 2020-02-12 10:48:52
一、Python函数剖析 1、函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def func(): #定义函数func() print("in the func") foo() #调用函数foo() func() #执行函数func() def foo(): #定义函数foo() print("in the foo") ###########打印输出########### #报错:函数foo没有定义 #NameError: name 'foo' is not defined #函数正确的调用方式 def func(): #定义函数func() print("in the func") foo() #调用函数foo() def foo(): #定义函数foo() print("in the foo") func() #执行函数func() ###########打印输出########### #in the func #in the foo 总结:被调用函数要在执行之前被定义  2、高阶函数 满足下列条件之一就可成函数为高阶函数 某一函数当做参数传入另一个函数中 函数的返回值包含一个或多个函数 刚才调用顺序中的函数稍作修改就是一个高阶函数 #高阶函数 def func():

python自动化运维之路04

南楼画角 提交于 2020-02-12 10:44:48
装饰器 装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。 在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。 相对于其它方式,装饰器语法简单,代码可读性高。因此,装饰器在Python项目中有广泛的应用。 装饰器的应用场景:饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装 饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。 概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。 装饰器的规则: 1 def derector(function): 2 def wrapper(*args,**kwargs): 3 function(*args,**kwargs) 4 return wrapper 装饰器可以用def的形式定义,如上面代码中的decorator。装饰器接收一个可调用对象作为输入参数,并返回一个新的可调用对象。 装饰器新建了一个可调用对象,也就是上面的wrapper。 1.装饰器中如何传递参数? def outter1(Func): def wrapper(args): print("Before") Func(args) print(

对Python【装饰器】的一点思考

会有一股神秘感。 提交于 2020-02-11 01:28:59
装饰器 python中装饰器做的事情:它们封装一个函数,并且用这样或者那样的方式来修改它的行为,装饰器让你在一个函数的前后去执行代码。在代码运行期间动态增加功能。 本质上:decorator(装饰器)就是一个返回函数的高阶函数 一、装饰器基础: 一切皆可对象,函数也是个对象,函数对象被赋值给变量,也可从函数中返回函数,甚至将函数作为参数传给另一个函数: def now ( ) : print ( '2020.2.10' ) f = now # 一切皆可对象,函数也是个对象,函数对象被赋值给变量 f ( ) # 调用该函数 利用__name__属性,可以拿到函数的名字: print ( now . __name__ ) print ( f . __name__ ) # __name__属性,拿到函数的名字 now 二、装饰器的蓝本: from functools import wraps # 装饰器会重写被装饰函数的名字和注释文档(docstring),有些依赖函数签名的代码执行就会出错,当用__name__属性查看函数名字会变成装饰器中的函数名。可用functools.wraps解决这一问题 def decorator_name ( f ) : # 装饰器,它的参数为function即函数 @wraps ( f ) # 用@来包裹被修饰的函数 def decorated ( *

python的装饰器

孤街醉人 提交于 2020-02-10 22:56:58
装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。 >>> def now(): ... print('2015-3-25') ... >>> f = now >>> f() 2015-3-25 函数对象有一个 __name__ 属性,可以拿到函数的名字: >>> now.__name__ 'now' >>> f.__name__ 'now' 现在,假设我们要增强 now() 函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改 now() 函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。 本质上,decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下: def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper 观察上面的 log ,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。我们要借助Python的@语法,把decorator置于函数的定义处: @log def now(): print('2015-3-25') 调用 now()

python wraps(装饰器)用法

一世执手 提交于 2020-02-10 22:47:50
在我们使用了装饰器函数之后,我们的被装饰函数默认指向了装饰器的名字(内存地址) 如: def wrapper(func): # func = holiday def inner(*args, **kwargs): print('在被装饰的函数执行之前做的事') ret = func(*args, **kwargs) print('在被装饰的函数执行之后做的事') return ret return inner @wrapper #holiday = wrapper(holiday) def holiday(day): ''' 这是一个放假通知 ''' print('全体放假%s天'%day) return '好开心' print(holiday.__name__)print(holiday.__doc__)该实例运行结果为: inner          我是inner函数的注释   上述例子中:holiday()函数为被装饰的函数,其实际内存地址指向了inner()装饰函数。也就是说如果我们想打印holiday()函数的名字、注释等,实际打印的是inner()函数的函数名、注释 那么怎么打印holiday()函数的名字跟注释等方法呢? 这时候我们就用到另一个内置的装饰器:wraps 如: from functools import wraps def wrapper(func):

python之添加认证功能装饰器

落花浮王杯 提交于 2020-02-10 15:36:00
user_id={'name':None,'passwd':False}def test(func): def wrapper(*args,**kwargs): if user_id['name'] and user_id['passwd']: res=func(*args,**kwargs) return res name=input('请输入用户名: ') passwd=input('请输入密码: ') if name=='alex' and passwd=='123456': user_id['name']=name user_id['passwd']=True res=func(*args,**kwargs) return res else: print('您输入的用户名或者密码错误!') return wrapper@testdef index(): print('欢迎用户登陆')index()---------------------------------------------------------------------------------请输入用户名: alex请输入密码: 123456欢迎用户登陆 来源: https://www.cnblogs.com/cxydnxs/p/12291038.html