python 装饰器实现_设计模式-装饰器 (Python实现)

1. 意图

动态地 向一个现有的对象添加新的功能,同时又不改变其结构。

我们为了扩展一个类经常使用继承方式实现。由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

2. 设计图

2ab8166710f6588cf431add9774e8f49.png

f2b64f9817e6efd68cd523c5cd91b6b2.png

3. 设计分析(对照以上UML类图)

db82e87793b9bfc5752bd9d297a0e1bb.png

3993481c7bc79733ff7eb57772a0f4c1.png

4. 应用场景

0086ec3852383ce91cbc10007cad7baf.png

5. 代码展示

用python实现,python除了可以用常规的实现方式外(与其它语言如java的实现一致),python自身在语法上直接支持装饰器decorator

5.1 以log输出为例

用函数来实现Log装饰器

def log1(strlog):

def decorator(fn):

@functools.wraps(fn)

def wrapper(*args, **kw):

print(strlog)

print('start %s()' % fn.__name__)

res = fn(*args, **kw)

print('end %s()' % fn.__name__)

return res

return wrapper

return decorator

用类来实现Log装饰器

class log2(object):

def __init__(self,strlog):

self.strlog=strlog

def __call__(self, fn):

@functools.wraps(fn)

def wrapper(*args, **kw):

print(self.strlog)

print('start %s()' % fn.__name__)

res = fn(*args, **kw)

print('end %s()' % fn.__name__)

return res

return wrapper

如何使用Log装饰器

@log('hello')

def test1():

print('I am function test1')

@log('hello')

def test2():

print('I am function test2')

@log2('hello')

def test3():

print('I am function test3')

def main():

test1()

test2()

test3()

5.2 以ODPS的UDF执行过程为例

2396ea3a18a89825d5f9179225099661.png

用函数来模拟实现以上annotate装饰器

def annotate1(str_param):

def decorator(cls):

class wrapper_class():

def __init__(self, *args, **kw):

newcls=cls(*args, **kw)

print(str_param)

newcls.evaluate(*args, **kw)

return wrapper_class

return decorator

用类来模拟实现以上annotate装饰器

class annotate2(object):

def __init__(self,str_param):

self.strinfo=str_param

def __call__(self, cls):

strinfo = self.strinfo

class wrapper_class():

def __init__(self, *args, **kw):

newcls=cls(*args, **kw)

print(strinfo)

newcls.evaluate(*args, **kw)

return wrapper_class

如何使用以上annotate装饰器

@annotate1('I am param in decorator')

class cls1(object):

def __init__(self):

print('I am class cls1')

def evaluate(self):

print('I am fun evaluate() in cls1')

@annotate2('I am param in decorator')

class cls2(object):

def __init__(self, param1, parma2):

print('I am class cls2')

def evaluate(self, param1, param2):

print('I am fun evaluate() in cls2. param1=%s, param2=%s.'% (param1,param2))

def main():

aa=cls1()

bb=cls2('param1','param2')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值