Python装饰器

装饰器

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容