装饰器
Python代码要符合一个开放封闭
的原则,所谓开放封闭
就是指的,对于之前的带么功能需要进行封闭,即不能随便的修改,但是可以进行添加新功能,这就是开放,所以有了装饰器这个东西
几个示例代码如下:
#coding=utf-8
def make(name='laowang'):
def make_fun(func):
def make_fun_in(*args,**kwargs):
print('hello world %s!'%name)
func(*args,**kwargs)
#直接打印出参数,但是并不是解包,所以会返回元组或者字典
#print(args,kwargs)
#同那个*或者**进行解包
#print(*args,**kwargs)
return make_fun_in
return make_fun
@make('xiaohua')
def test(a,b,c):
print('hello test%s,%s,%s'%(a,b,c))
test('shandong','zibo','zhangdian')
"""
可以通过上述方法进行调用,也可以通过下面方法
在这里make方法将test函数作为参数传入,整个make('xiaohua')(test)会将
make_fun_in返回过来,make_fun_in中需要的参数,也就是往test(a,b,c)的参数
"""
# def test(a,b,c):
# print('hello test%s,%s,%s'%(a,b,c))
# make('xiaohua')(test)('shandong','zibo','zhangdian')
#coding=utf-8
def make1(func):
def make_in():
return '<h1>'+func()+'</h1>'
return make_in
def make2(func):
def make_in():
return '<h2>'+func()+'</h2>'
return make_in
# 会按照就近原则,先使用靠近test函数的装饰器进行装饰(make2),
# 再使用make1进行装饰
@make1
@make2
def test():
return 'hello world'
print(test())
#coding=utf-8
class make_fun(object):
def __init__(self,func):
self.func = func
def __call__(self):
#print(self.func())
return self.func()
@make_fun
def test():
return 'hello world'
# test()
reuslt = test()
# reuslt = test.__call__()
print(reuslt)
"""
test = make_fun(test)
此时等号左边test是一个对象,其中make_fun类对__call__方法做了重写,当执行test()
的时候会调用它的__call__方法,当然也可以通过test.__call__()进行方法调用
"""
#coding=utf-8
def make(username):
def make_fun(func):
def make_fun_in(*args,**kwargs):
print(username)
print('hello make_fun')
for key,value in kwargs.items():
'''
python3运行下面print代码会展示 name = python
但是python2运行的话会展示('name','=','python')
将会是一个元组
'''
print(key,'=',value)
print(key,value)
print(key)
return func(*args,**kwargs)
return make_fun_in
return make_fun
# 为了展示装饰器的原理,故将下面给注释
# @make('Laowang')
# def test(a,b,c,name = 123):
# return '%s,%s,%s,'%(a,b,c)
# result = test(1,2,3,name = 'python')
# print(result)
def test(a,b,c,name = 123):
return '%s,%s,%s,'%(a,b,c)
result = make('Laowang')(test)(1,2,3,name = 'python')
print(result)