1 Python装饰器管理类和函数
Python装饰器可以管理函数和实例的调用,也可以直接管理函数和类本身。
1.1 装饰器将函数和类保存到字典
描述
通过装饰器将函数或类保存到字典,以便后续使用。
(1) 定义一个字典;
(2) 定义一个装饰器,将装饰的函数或类保存到字典;
(3) 装饰器不调用函数或类,直接返回函数或类;
(4) 通过字典访问保存的函数或类;
示例
>>> registry={}
>>> def register(obj):registry[obj.__name__]=objreturn obj>>> @register
def testadd(a,b):return a+b>>> @register
def testsub(a,b):return a-b
>>> @register
class TestMul:def __init__(self,a,b):self.mul=a*bdef __str__(self):return str(self.mul)>>> for k in registry:print(k,'->',registry[k],type(registry[k]))testadd -> <function testadd at 0x000001B92C23BAF0> <class 'function'>
testsub -> <function testsub at 0x000001B92C2FC040> <class 'function'>
TestMul -> <class '__main__.TestMul'> <class 'type'>>>> for k in registry:print(k,'=>',registry[k](5,2))testadd => 7
testsub => 3
TestMul => 10
1.2 装饰器为函数添加属性
描述
通过装饰器为装饰函数添加属性,以便后续使用。
(1) 定义一个装饰器;
(2) 为装饰函数添加属性,内部给属性值,或者外部送入属性值;
(3) 返回装饰函数;
(4) 访问装饰器函数添加的属性;
示例
>>> def markdeco(func):func.marked=Truereturn func>>> @markdeco
def testmul(a,b):return a*b>>> testmul.marked
True
>>> def myannotate(note):def notedeco(func):func.lab=notereturn funcreturn notedeco
>>> @myannotate('梯阅线条')
def testsub(a,b):return a-b>>> testsub.lab
'梯阅线条'
>>> testsub(5,2)
3