*每天都有新体验

装饰者模式

  • 装饰器类能动态的拓展对象的功能:

理解示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#coding=utf8

class foo(object):
	def f1(self):
		print("or f1")
	def f2(self):
		print("or f2")
class foo_d(object):
	def __init__(self,de):
		self._de = de
	def f1(self):
		print("de f1")
	def __getattr__(self,name):
		return getattr(self._de,name)
t = foo()
v = foo_d(t)
t.f1()
v.f1()
v.f2()


######out
or f1
de f1
or f2
[Finished in 0.1s]

__getattr__(self,name) 可以像字典一样查找属性。在装饰器中就是获取被包装类的属性。

使用functools包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#coding=utf8
import functools
def log(text):
	@functools.wraps(text)
	def wrapper(*args,**kwargs):
		print("wrapper")
		return text(*args,**kwargs)
	return wrapper
@log
def  now():
	print("time")
now()

#####output
wrapper
time
[Finished in 0.1s]
  • 方法就是通过@标签定义一个包装器方法,再在被包装方法前加响应的标签就会被包装起来了。