一、不带参数的装饰器
#coding=utf-8
def deco(func):
print 'xiushiyixia'
return func
@deco
def foo():
print 'foo is fun'
#相当于执行了下面这句
#foo=deco(foo)
第一个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco函数内对传入的函数对象做一番“装饰”,然后返回这个对象(
记住一定要返回
,不然外面调用foo的地方将会无函数可用。实际上此时 foo=deco(foo),类似下面:
#coding=utf-8
def deco(func):
print 'xiushiyixia'
return func
def foo():
print 'foo is fun'
foo=deco(foo)
二、带参数的装饰器
# -*- coding:utf8 -*-
'''示例8: 装饰器带参数'''
def setup(url):
def func1(func):
print '111'+url
return func
return func1
@setup('http://www.baidu.com')
def jia(a):
print a,'this is func'
jia('2')
三、装饰器带类参数
# -*- coding:utf-8 -*-
'''示例8: 装饰器带类参数'''
class people:
def work():
print 'people can work'
@staticmethod
def eat():
print 'people can eat food'
def deco(cla):
def a(func):
cla.eat()
print 'this is a'
return func
return a
@deco(people)
def func():
print 'this is func'
#func()
四、一个函数两个装饰器
def a(fn):
print 'a'
def d(st):
print st+'d'
return d
def b(fn):
print 'b'
return fn
@a
@b
def c(st):
print st
c('c')
五、修饰器场景---验证用户名密码
#coding:utf-8
def login(username,password):
def func(b):
if username=='1' and password=='1':
print 'login name is',username
return b
else:
print 'username or password is Error'
return func
@login('1','1')
def click():
print 'this is click'
@login('gyp','1')
def ondbclick():
print 'this is ondbclick'
click()
ondbclick()
六、@functools.wraps(func)
#coding=utf-8
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print '%s %s():' % (text, func.__name__)
return func(*args, **kw)
return wrapper
return decorator
@log('1')
def func(a,b):
print a,b
func('m','n')
#@functools.wraps(func)作用是经过装饰的函数和原函数属性完全一样