python装饰器应用_Python装饰器使用示例及实际应用例子

测试1

deco运行,但myfunc并没有运行

def deco(func):

print 'before func'

return func

def myfunc():

print 'myfunc() called'

myfunc = deco(myfunc)

20153695110846.png?20152695119

测试2

需要的deco中调用myfunc,这样才可以执行

def deco(func):

print 'before func'

func()

print 'after func'

return func

def myfunc():

print 'myfunc() called'

myfunc = deco(myfunc)

20153695130082.png?20152695139

测试3

@函数名 但是它执行了两次

def deco(func):

print 'before func'

func()

print 'after func'

return func

@deco

def myfunc():

print 'myfunc() called'

myfunc()

20153695148926.png?20152695153

测试4

这样装饰才行

def deco(func):

def _deco():

print 'before func'

func()

print 'after func'

return _deco

@deco

def myfunc():

print 'myfunc() called'

myfunc()

20153695201859.png?2015269527

测试5

@带参数,使用嵌套的方法

def deco(arg):

def _deco(func):

print arg

def __deco():

print 'before func'

func()

print 'after func'

return __deco

return _deco

@deco('deco')

def myfunc():

print 'myfunc() called'

myfunc()

20153695221825.png?20152695229

测试6

函数参数传递

def deco(arg):

def _deco(func):

print arg

def __deco(str):

print 'before func'

func(str)

print 'after func'

return __deco

return _deco

@deco('deco')

def myfunc(str):

print 'myfunc() called ', str

myfunc('hello')

20153695238354.png?20152695245

测试7

未知参数个数

def deco(arg):

def _deco(func):

print arg

def __deco(*args, **kwargs):

print 'before func'

func(*args, **kwargs)

print 'after func'

return __deco

return _deco

@deco('deco1')

def myfunc1(str):

print 'myfunc1() called ', str

@deco('deco2')

def myfunc2(str1,str2):

print 'myfunc2() called ', str1, str2

myfunc1('hello')

myfunc2('hello', 'world')

20153695256132.png?2015269533

测试8

class作为修饰器

class myDecorator(object):

def __init__(self, fn):

print "inside myDecorator.__init__()"

self.fn = fn

def __call__(self):

self.fn()

print "inside myDecorator.__call__()"

@myDecorator

def aFunction():

print "inside aFunction()"

print "Finished decorating aFunction()"

aFunction()

20153695316631.png?20152695322

测试9

class myDecorator(object):

def __init__(self, str):

print "inside myDecorator.__init__()"

self.str = str

print self.str

def __call__(self, fn):

def wrapped(*args, **kwargs):

fn()

print "inside myDecorator.__call__()"

return wrapped

@myDecorator('this is str')

def aFunction():

print "inside aFunction()"

print "Finished decorating aFunction()"

aFunction()

20153695335706.png?20152695342

实例

给函数做缓存 --- 斐波拉契数列

from functools import wraps

def memo(fn):

cache = {}

miss = object()

@wraps(fn)

def wrapper(*args):

result = cache.get(args, miss)

if result is miss:

result = fn(*args)

cache[args] = result

return result

return wrapper

@memo

def fib(n):

if n < 2:

return n

return fib(n - 1) + fib(n - 2)

print fib(10)

注册回调函数 --- web请求回调

class MyApp():

def __init__(self):

self.func_map = {}

def register(self, name):

def func_wrapper(func):

self.func_map[name] = func

return func

return func_wrapper

def call_method(self, name=None):

func = self.func_map.get(name, None)

if func is None:

raise Exception("No function registered against - " + str(name))

return func()

app = MyApp()

@app.register('/')

def main_page_func():

return "This is the main page."

@app.register('/next_page')

def next_page_func():

return "This is the next page."

print app.call_method('/')

print app.call_method('/next_page')

mysql封装 -- 很好用

import umysql

from functools import wraps

class Configuraion:

def __init__(self, env):

if env == "Prod":

self.host = "coolshell.cn"

self.port = 3306

self.db = "coolshell"

self.user = "coolshell"

self.passwd = "fuckgfw"

elif env == "Test":

self.host = 'localhost'

self.port = 3300

self.user = 'coolshell'

self.db = 'coolshell'

self.passwd = 'fuckgfw'

def mysql(sql):

_conf = Configuraion(env="Prod")

def on_sql_error(err):

print err

sys.exit(-1)

def handle_sql_result(rs):

if rs.rows > 0:

fieldnames = [f[0] for f in rs.fields]

return [dict(zip(fieldnames, r)) for r in rs.rows]

else:

return []

def decorator(fn):

@wraps(fn)

def wrapper(*args, **kwargs):

mysqlconn = umysql.Connection()

mysqlconn.settimeout(5)

mysqlconn.connect(_conf.host, _conf.port, _conf.user, \

_conf.passwd, _conf.db, True, 'utf8')

try:

rs = mysqlconn.query(sql, {})

except umysql.Error as e:

on_sql_error(e)

data = handle_sql_result(rs)

kwargs["data"] = data

result = fn(*args, **kwargs)

mysqlconn.close()

return result

return wrapper

return decorator

@mysql(sql = "select * from coolshell" )

def get_coolshell(data):

... ...

... ..

线程异步

from threading import Thread

from functools import wraps

def async(func):

@wraps(func)

def async_func(*args, **kwargs):

func_hl = Thread(target = func, args = args, kwargs = kwargs)

func_hl.start()

return func_hl

return async_func

if __name__ == '__main__':

from time import sleep

@async

def print_somedata():

print 'starting print_somedata'

sleep(2)

print 'print_somedata: 2 sec passed'

sleep(2)

print 'print_somedata: 2 sec passed'

sleep(2)

print 'finished print_somedata'

def main():

print_somedata()

print 'back in main'

print_somedata()

print 'back in main'

main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值