zoukankan      html  css  js  c++  java
  • python使用类作为装饰器

    1、普通就是一个函数作为装饰器,也可以用类名作为装饰器。

    因为类和函数都是callable的,都可以使用括号来调用运行他。

    2、上上篇的缓存一段时间的还是函数作为装饰器,类只是充当了比模块更下一级的命名空间,因为我的模块很大,不想搞很多模块级全局变量,所以用了class外壳。

    正宗的类装饰器是这样

    from functools import update_wrapper
    class Deco:
        """
        Deco 的document
        """
    
        def __init__(self,func):
            self._func = func
            self._func_name = func.__name__
            update_wrapper(self, self._func)
    
        def __call__(self):
            print('啦啦啦德玛西亚')
            return self._func,self._func_name,self._func()
    
    
    
    
    @Deco
    def f1():
        """
        f1 的document
        :return:
        """
        return 'hello world'
    print(f1)
    print(f1.__doc__)
    print (f1())

    结果是这样

    好处是相比于函数装饰器少了闭包,缺点是函数行为变了,但函数签名没有完全变过来,这样运行后函数成了装饰器类的一个实例了。

    使用类作为装饰器来装饰一个函数和使用函数作为装饰器来装饰一个类是不同的概念。

    函数装饰器来装饰一个类,也写过了  https://www.cnblogs.com/ydf0509/p/9211521.html

  • 相关阅读:
    模拟Promise
    js 重写concat
    js 重写 slice
    es6继承
    es5 简单继承
    iterator 和yield的关系
    iterator接口 ...和for of依赖的关键
    e.offsetX,Y到底是相对于谁
    mysql alter修改数据库表结构用法
    mysql修改表结构
  • 原文地址:https://www.cnblogs.com/ydf0509/p/9353714.html
Copyright © 2011-2022 走看看