设为首页 加入收藏

TOP

Python各式装饰器(一)
2015-07-16 12:57:30 来源: 作者: 【 】 浏览:19
Tags:Python 各式 装饰

Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义。


一、函数式装饰器:装饰器本身是一个函数。


1.装饰函数:被装饰对象是一个函数


[1]装饰器无参数:


a.被装饰对象无参数:


>>> def test(func):


? ? def _test():


? ? ? ? print 'Call the function %s().'%func.func_name


? ? ? ? return func()


? ? return _test


?


>>> @test


def say():return 'hello world'


?


>>> say()


Call the function say().


'hello world'


>>>?



?b.被装饰对象有参数:


>>> def test(func):


? ? def _test(*args,**kw):


? ? ? ? print 'Call the function %s().'%func.func_name


? ? ? ? return func(*args,**kw)


? ? return _test


?


>>> @test


def left(Str,Len):


? ? #The parameters of _test can be '(Str,Len)' in this case.


? ? return Str[:Len]


?


>>> left('hello world',5)


Call the function left().


'hello'


>>>?



?[2]装饰器有参数:


a.被装饰对象无参数:


>>> def test(printResult=False):


? ? def _test(func):


? ? ? ? def __test():


? ? ? ? ? ? print 'Call the function %s().'%func.func_name


? ? ? ? ? ? if printResult:


? ? ? ? ? ? ? ? print func()


? ? ? ? ? ? else:


? ? ? ? ? ? ? ? return func()


? ? ? ? return __test


? ? return _test


?


>>> @test(True)


def say():return 'hello world'


?


>>> say()


Call the function say().


hello world


>>> @test(False)


def say():return 'hello world'


?


>>> say()


Call the function say().


'hello world'


>>> @test()


def say():return 'hello world'


?


>>> say()


Call the function say().


'hello world'


>>> @test


def say():return 'hello world'


?


>>> say()


?


Traceback (most recent call last):


? File "", line 1, in


? ? say()


TypeError: _test() takes exactly 1 argument (0 given)


>>>?



由上面这段代码中的最后两个例子可知:当装饰器有参数时,即使你启用装饰器的默认参数,不另外传递新值进去,也必须有一对括号,否则编译器会直接将func传递给test(),而不是传递给_test()


b.被装饰对象有参数:


>>> def test(printResult=False):


? ? def _test(func):


? ? ? ? def __test(*args,**kw):


? ? ? ? ? ? print 'Call the function %s().'%func.func_name


? ? ? ? ? ? if printResult:


? ? ? ? ? ? ? ? print func(*args,**kw)


? ? ? ? ? ? else:


? ? ? ? ? ? ? ? return func(*args,**kw)


? ? ? ? return __test


? ? return _test


?


>>> @test()


def left(Str,Len):


? ? #The parameters of __test can be '(Str,Len)' in this case.


? ? return Str[:Len]


?


>>> left('hello world',5)


Call the function left().


'hello'


>>> @test(True)


def left(Str,Len):


? ? #The parameters of __test can be '(Str,Len)' in this case.


? ? return Str[:Len]


?


>>> left('hello world',5)


Call the function left().


hello


>>>?



?


2.装饰类:被装饰的对象是一个类


[1]装饰器无参数:


a.被装饰对象无参数:


>>> def test(cls):


? ? def _test():


? ? ? ? clsName=re.findall('(\w+)',repr(cls))[-1]


? ? ? ? print 'Call %s.__init().'%clsName


? ? ? ? return cls()


? ? return _test


?


>>> @test


class sy(object):


? ? value=32


?


? ?


>>> s=sy()


Call sy.__init().


>>> s


<__main__.sy object at 0x0000000002C3E390>


>>> s.value


32


>>>?



b.被装饰对象有参数:


>>> def test(cls):


? ? def _test(*args,**kw):


? ? ? ? clsName=re.findall('(\w+)',repr(cls))[-1]


? ? ? ? print 'Call %s.__init().'%clsName


? ? ? ? return cls(*args,**kw)


? ? return _test


?


>>> @test


class sy(object):


? ? def __init__(self,value):
? ? ? ? ? ? ? ? #The parameters of _test can be '(value)' in this case.


? ? ? ? self.value=value


?


? ? ? ?


>>> s=sy('hello world')


Call sy.__init().


>>> s


<__main__.sy object at 0x0000000003AF7748>


>>> s.value


'hello world'


>>>?



?[2]装饰器有参数:


a.被装饰对象无参数:


>>> def test(printValue=True):


? ? def _test(cls):


? ? ? ? def __test():


? ? ? ? ? ? clsName=re.findall('(\w+)',repr(cls))[-1]


? ? ? ? ? ? print 'Call %s.__init().'%clsName


? ? ? ? ? ? obj=cls()


? ? ? ? ? ? if printValue:


? ? ? ? ? ? ? ? print 'value = %r'%obj.value


? ? ? ? ? ? return obj


? ? ? ? return __test


? ? return _test


?


>>> @test()


class sy(object):


? ? def __init__(self):


? ? ? ? self.value=32


?


? ? ? ?


>>> s=sy()


Call sy.__init().


value = 32


>>> @test(False)


class sy(object):


? ? def __init__(self):


? ? ? ? self.value=32


?


? ? ? ?


>>> s=sy()


Call sy.__init().


>>>?



?b.被装饰对象有参数:


>>> def test(printValue=True):


? ? def _test(

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇二叉树的递归遍历和非递归(循环).. 下一篇Python IDLE 清屏问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: