python 装饰器decorator

2018-12-04  本文已影响0人  Karl_2c80
In [24]: def count():
    ...:     a = 1
    ...:     b = 2
    ...:     def sum():
    ...:         c = 1
    ...:         return a + c
    ...:     return sum
    ...:

装饰器 decorator

1. 原函数不带函数

#!/usr/bin/python
# -*- coding:utf-8 -*-

def setTag(func):
    def wrapper():
        print 'It is a fine day!'
        func()
    return wrapper

@setTag
def hello():
    print 'Hello '

hello()
[root@KARL task_w2]# python decorator.py
It is a fine day!
Hello

2. 原函数带参数

#!/usr/bin/python
# -*- coding:utf-8 -*-

def setTag(func):
    def wrapper(*args, **kwargs):
        print 'It is a fine day!'
        func(*args, **kwargs)
    return wrapper

@setTag
def hello(name):
    print 'Hello '+name

hello('Karl')
[root@KARL task_w2]# python decorator.py
It is a fine day!
Hello Karl

3. 原函数带参数且有返回值

#!/usr/bin/python
#coding:utf8

def setTag(func):
    def wrapper(*args, **kwargs):
        print 'It is a fine day!'
        # res = func(*args, **kwargs)      # res来接收被装饰函数的返回值
        # return res                       # 这2行可合并为1行,如下
        return func(*args, **kwargs)

@setTag         ## 相当于 hello = setTag(hello)
def hello(name):
    return 'Hello '+name

print hello('Karl')
[root@KARL scripts]# python decorator.py
It is a fine day!
Hello Karl

4. 装饰器带参数

#!/usr/bin/python
#coding:utf8

def setTag(day):      # 1)先传装饰器的参数
    def wrapper(func):      # 2)再将被装饰函数作为参数传进来
        def inner_wrapper(*args, **kwargs):      # 3)最后传被装饰函数的参数
            print 'It is a fine day!'
            print 'Today is %s' %day
            return func(*args, **kwargs)
        return inner_wrapper
    return wrapper

@setTag('Sunday')      # 等同于 hello = setTag(day='Sunday')(hello)
def hello(name):
    return 'Hello '+name

print hello('Karl')
[root@KARL scripts]# python decorator.py
It is a fine day!
Today is Sunday
Hello Karl

5. 一个函数被多个装饰器装饰

#!/usr/bin/python
#coding:utf8

def setTag(day):      # 1)先传装饰器的参数
    def wrapper(func):      # 2)再将被装饰函数作为参数传进来
        def inner_wrapper(*args, **kwargs):      # 3)最后传被装饰函数的参数
            print 'It is a fine day!'
            print 'Today is %s' %day
            return func(*args, **kwargs)
        return inner_wrapper
    return wrapper
def myName(name):
    def outer(func):
        def inner(*args, **kwargs):
            print "My name's %s" %name
            return func(*args, **kwargs)
        return inner
    return outer

@myName('Tom')   # 等同于 hello = myName(setTag(hello)),考虑参数则等同于 hello = myName(name='Tom')(setTag(day='Sunday')(hello))
@setTag('Sunday')   # 等用于 hello = setTag(hello), 考虑参数则等同于 hello = setTag(day='Sunday')(hello)
def hello(name):
    return 'Hello '+name

print hello('Karl')
[root@KARL scripts]# python multi_decorator.py
My name's Tom
It is a fine day!
Today is Sunday
Hello Karl
上一篇下一篇

猜你喜欢

热点阅读