Python特性_装饰器
python装饰器
K有话说:装饰器就是装饰一定功能模块的器具,不想修改函数的调用方式,但是想在原来的函数上添加功能
设计装饰器的目的是:
1. 软件已经设计完成,想给某些功能模块添加功能,直接改这个模块会牵一发动全身(包括参数、返回值都不能改,直接改会出现预想不到的结果,尤其更改基础模块,且在多人开发的环境下,都要调用这个模块)
2. 软件开发过程中,想给所有模块添加指定的功能,比方说添加每个模块的运行时间,每个模块都改,工作量过大,且费力出错率高。
3.对于一些重复率较高的功能模块,且通用性较强的模块,可以写成装饰器
装饰器的原则:
1. 不改变函数的调用方式
2.不改变函数的返回参数
例子:
1. 不带参数装饰器的例子
需求:给一个模块加上时间统计功能
原先功能模块
def demorange(inta): for i in range(inta): import time time.sleep(0.2) print(i)
需要在上述功能模块添加所消耗时间统计,并将消耗时间输出
完整代码
def ansytime(fun): def swap(*args, **kwargs): import time kstime = time.time() fun(*args, **kwargs) endtime = time.time() print(fun.__name__, "函数所消耗的时间为", endtime - kstime) return swap @ansytime def demorange(inta): for i in range(inta): import time time.sleep(0.2) print(i) demorange(5)
2. 带参数的装饰器
需求:每个功能模块需要加上开发人的信息,方便管理,由于开发人员不唯一,所以需要传递开发人员的信息,在上面代码做更改
完整代码
def author_time(arv): def ansytime(fun): def swap(*args, **kwargs): import time kstime = time.time() fun(*args, **kwargs) endtime = time.time() print(fun.__name__, "函数所消耗的时间为", endtime - kstime) return swap print('开发人员信息:', arv) return ansytime @author_time("kimy") def demorange(inta): for i in range(inta): import time time.sleep(0.2) print(i) demorange(5)
Python常用的装饰器
1. staticmethod
用来修饰类的装饰器,使用该方法可以直接用雷鸣来访问,如: class.fun()
class DemoClass(object): def __init__(self): pass @staticmethod def cfun(stra): print(stra) @staticmethod def cfunb(): print("demo") DemoClass.cfun("hello") DemoClass.cfunb()
2.classmethod
和staticmehod类似,classmethod会将class传入被修饰的方法中。
class DemoClass(object):
def __init__(self):
self.name = "kimy"
@staticmethod
def cfun(stra):
print(stra)
@classmethod
def cfunb(cls):
print(cls().name)
DemoClass.cfun("hello")
DemoClass.cfunb()
3.property
讲方法编程类的属性来表示
class DemoClass(object): def __init__(self): self.name = "kimy" @property def cfun(self): for i in range(6): print(self.name, ":", i) DemoClass().cfun
浙公网安备 33010602011771号