您的位置:首页 > 编程语言 > Python开发

Python 装饰器笔记

2016-01-21 04:48 579 查看

一、装饰器无参数

1.原函数无参数

defwrap_in_tag_b(fn):#wrap_in_tag_b是真正的装饰器
defwrapped():
return"<b>"+fn()+"</b>"
returnwrapped

defwrap_in_tag_i(fn):
defwrapped():
return"<i>"+fn()+"</i>"
returnwrapped

@wrap_in_tag_b
@wrap_in_tag_i
defhello():
return"hello"

print(hello())#returns"<b><i>helloworld</i></b>"


2.原函数带参数

defwrap_in_tag_b(fn):
defwrapped(arg):#arg是原函数参数
return"<b>"+fn(arg)+"</b>"
returnwrapped

defwrap_in_tag_i(fn):
defwrapped(arg):#arg是原函数参数
return"<i>"+fn(arg)+"</i>"
returnwrapped

@wrap_in_tag_b
@wrap_in_tag_i
defhello(name):
return"hello{}".formar(name)

print(hello('Jack'))


二、装饰器带参数

1.原函数无参数

defwrap_in_tag(deco_arg):
#装饰器参数:deco_arg
#可以在任意位置使用
defreal_decorator(func):#real_decorator才是即将返回的真正的装饰器
    #原函数参数:func_arg
    #只可以在此位置使用
    defwrapped():
return"<{0}>{1}</{0}>".format(deco_arg,func())
returnwrapped
returnreal_decorator

@wrap_in_tag('b')
@wrap_in_tag('i')
defhello():
return"hello"

print(hello())


2.原函数带参数

defwrap_in_tag(deco_arg):
#装饰器参数:deco_arg
#可以在任意位置使用
defreal_decorator(func):#real_decorator才是即将返回的真正的装饰器
defwrapped(func_arg):
#原函数参数:func_arg
#只可以在此位置使用
return"<{0}>{1}</{0}>".format(deco_arg,func(func_arg))
returnwrapped
returnreal_decorator

@wrap_in_tag('b')
@wrap_in_tag('i')
defhello(name):
return"hello{}".format(name)

print(hello('Jack'))



三、装饰器类

1.原函数无参数

classwrap_in_tag(object):
def__init__(self,deco_arg):
self.tag=deco_arg#装饰器参数:deco_arg

def__call__(self,func):
defnewf():#原函数无参数
return"<{0}>{1}</{0}>".format(self.tag,func())
returnnewf

@wrap_in_tag('b')
@wrap_in_tag('i')
defhello():
return'hello'

print(hello())



2.原函数带参数

classwrap_in_tag(object):
def__init__(self,deco_arg):
self.tag=deco_arg#装饰器参数:deco_arg

def__call__(self,func):
defnewf(func_arg):#原函数参数:func_arg
return"<{0}>{1}</{0}>".format(self.tag,func(func_arg))
returnnewf

@wrap_in_tag('b')
@wrap_in_tag('i')
defhello(name):
return"hello{}".format(name)

print(hello('Jack'))


四、用装饰器装饰类

1.用函数作为装饰器

defwrap_in_tag(deco_arg):
defreal_decorator(func):
defwrapped(self,func_arg):#类方法接收第一个参数都是self,这个必须有,而无论func_arg是否有!!!
return"<{0}>{1}</{0}>".format(deco_arg,func(func_arg))
returnwrapped
returnreal_decorator

classfoo(object):

@wrap_in_tag('b')
@wrap_in_tag('i')
defhello(self,name):
return'hello{}".format(name)

@wrap_in_tag('b')
@wrap_in_tag('i')
defbyebye(self,name):
return'byebye{}".format(name)

f=foo()
print(f.hello('Jack')



2.用类作为装饰器

classwrap_in_tag(object):
def__init__(self,deco_arg):
self.tag=deco_arg

def__call__(self,func):
defnewf(slf,func_arg):#slf必须!self被占用了,那就给第一个参数另一个名字slf(随便)
return"<{0}>{1}</{0}>".format(self.tag,func(func_arg))
returnnewf

classfoo(object):

@wrap_in_tag('b')
@wrap_in_tag('i')
defhello(self,name):
return'hello{}".format(name)

@wrap_in_tag('b')
@wrap_in_tag('i')
defbyebye(self,name):
return'byebye{}".format(name)

f=foo()
print(f.hello('Jack'))


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: