python装饰器最典型的应用,Python装饰器使用示例及实际应用例子

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')

bfc303f83d11a4f1549e5fc3c378d669.png

测试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()

c58a4d24b8b3024e703994f1a3fd2296.png

测试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()

b59d5cf87bfe68352a3bb1f91d07e7f3.png

实例

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

复制代码 代码如下:

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()

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

47d507a036d4dd65488c445c0974b649.png

立即提交

专题推荐064df72cb40df78e80e61b7041ee044f.png独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

7dafe36c040e31d783922649aefe0be1.png玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

04246fdfe8958426b043c89ded0857f1.png天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

php中文网:公益在线php培训,帮助PHP学习者快速成长!

Copyright 2014-2020 https://www.php.cn/ All Rights Reserved | 苏ICP备2020058653号-1e6cebb680dfe320dad7e62bd6442c3a6.gif

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值