zoukankan      html  css  js  c++  java
  • python 装饰器(五):装饰器实例(二)类装饰器(类装饰器装饰函数)

    回到装饰器上的概念上来,装饰器要求接受一个callable对象,并返回一个callable对象(不太严谨,详见后文)。

    那么用类来实现也是也可以的。我们可以让类的构造函数__init__()接受一个函数,然后重载__call__()并返回一个函数,也可以达到装饰器函数的效果。

    基本类装饰器

    class logging(object):
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            print "[DEBUG]: enter function {func}()".format(
                func=self.func.__name__)
            return self.func(*args, **kwargs)
    @logging
    def say(something):
        print "say {}!".format(something)

    带参数的类装饰器

    如果需要通过类形式实现带参数的装饰器,那么会比前面的例子稍微复杂一点。那么在构造函数里接受的就不是一个函数,而是传入的参数。

    通过类把这些参数保存起来。然后在重载__call__方法是就需要接受一个函数并返回一个函数。

    class logging(object):
        def __init__(self, level='INFO'):
            self.level = level
            
        def __call__(self, func): # 接受函数
            def wrapper(*args, **kwargs):
                print "[{level}]: enter function {func}()".format(
                    level=self.level,
                    func=func.__name__)
                func(*args, **kwargs)
            return wrapper  #返回函数
    
    @logging(level='INFO')# 先执行loggin(level='INFO'),再执行@
    def say(something):
        print "say {}!".format(something)
  • 相关阅读:
    建议初创团队起初也要构建分布式应用
    PHP对大文件的处理思路
    php高级研发或架构师必了解---面试题系列
    数据库schema设计与优化
    大型web系统数据缓存设计
    PHP正则表达式
    PHP 生成图片缩略图函数
    PHP与Memcached服务器交互的分布式实现源码分析
    SOA面向服务架构——SOA的概念
    php中socket的使用
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12949036.html
Copyright © 2011-2022 走看看