博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 装饰器应用
阅读量:5269 次
发布时间:2019-06-14

本文共 2404 字,大约阅读时间需要 8 分钟。

1 注册回调函数

下面这个示例展示了通过URL的路由来调用相关注册的函数示例:

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

 

注意:

1)上面这个示例中,用类的实例来做decorator。
2)decorator类中没有__call__(),但是wrapper返回了原函数。所以,原函数没有发生任何变化。

 

2 打印日志

from functools import wraps

import inspect

def get_line_number():

    return inspect.currentframe().f_back.f_back.f_lineno

 

def logger(loglevel):

    def log_decorator(fn):

        @wraps(fn)

        def wrapper(*args, **kwargs):

            ts = time.time()

            result = fn(*args, **kwargs)

            te = time.time()

            print "function   = " + fn.__name__,

            print "    arguments = {0} {1}".format(args, kwargs)

            #print "    return    = {0}".format(result)

            print "    time      = %.6f sec" % (te-ts)

            if (loglevel == 'debug'):

                print "    called_from_line : " + str(get_line_number())

            return result

        return wrapper

    return log_decoratorspam(1,2,3)

 

3 调用追踪

import sys,os,linecache

def trace(f):

  def globaltrace(frame, why, arg):

    if why == "call": return localtrace

    return None

  def localtrace(frame=1, why=2, arg=4):

    if why == "line":

      # record the file name and line number of every trace

      filename = frame.f_code.co_filename

      lineno = frame.f_lineno

      bname = os.path.basename(filename)

      print "{}({}): {}".format(  bname,

                    lineno,

                    linecache.getline(filename, lineno)),

    return localtrace

  def _f(*args, **kwds):

    sys.settrace(globaltrace)

    result = f(*args, **kwds)

    sys.settrace(None)

    return result

  return _f

 

@trace

def xxx():

  a=1

  print a

 

 

xxx() #调用

 

4 单例模式

 

# coding=utf-8

 

# 测试utf-8编码

 

# 单例装饰器

 

import sys

 

reload(sys)

 

sys.setdefaultencoding('utf-8')

 

 

 

# 使用装饰器实现简单的单例模式

 

def singleton(cls):

 

    instances = dict()  # 初始为空

 

    def _singleton(*args, **kwargs):

 

        if cls not in instances:  #如果不存在, 则创建并放入字典

 

            instances[cls] = cls(*args, **kwargs)

 

        return instances[cls]

 

    return _singleton

 

 

 

@singleton

 

class Test(object):

 

    pass

 

if __name__ == '__main__':

 

    t1 = Test()

 

    t2 = Test()

 

    # 两者具有相同的地址

 

    print t1

 

    print t2

 

转载于:https://www.cnblogs.com/sysnap/p/6603902.html

你可能感兴趣的文章
js 原型继承和class继承
查看>>
java的反射机制浅谈 分类: java
查看>>
设计模式-适配器模式(adapter)
查看>>
IIS给网站地址配置成HTTPS的
查看>>
jenkins 邮件添加附件
查看>>
周总结
查看>>
论移动办公系统的强势崛起
查看>>
[翻译] Using Custom Functions in a Report 在报表中使用自己义函数
查看>>
sqlserver表分区小结
查看>>
《算法导论》第6章 堆排序 (3)K路归并
查看>>
win8修改窗口背景颜色的方法
查看>>
哈希算法-Time33
查看>>
有了 indexOf,为什么 ECMAScript 7 还添加了 Array.prototype.include
查看>>
linux环境下多线程编程
查看>>
JavaScript 简介及语法语句
查看>>
php-人员权限管理(RBAC)
查看>>
URAL 1203 Scientific Conference 简单dp 难度:0
查看>>
VS调试快捷键
查看>>
实例游戏内存修改器----CUI版本模拟
查看>>
ubuntu安装MySQL笔记
查看>>