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

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

1. 修改类函数。

场景: 如果要给一个类的所有方法加上计时,并打印出来。demo如下:

# -*- coding:utf-8 -*-import timedef time_it(fn):    "Example of a method decorator"    def decorator(*args, **kwargs):    t1=time.time()        ret = fn(*args, **kwargs)    print '\t\t%d seconds taken for %s'%(time.time()-t1, fn.__name__)    return ret    return decoratordef class_decorator(*method_names):    def class_rebuilder(cls):        "The class decorator example"        class NewClass(cls):            "This is the overwritten class"            def __getattribute__(self, attr_name):                attr_val = super(NewClass, self).__getattribute__(attr_name)                if callable(attr_val) and attr_name in method_names:                    return time_it(attr_val)                return attr_val        return NewClass    return class_rebuilder@class_decorator('first_method', 'second_method')class MySecondClass(object):    """    This class is decorated    """    def first_method(self, *args, **kwargs):        print "\tthis is a the MySecondClass.first_method"    time.sleep(2)    def second_method(self, *args, **kwargs):        print "\tthis is the MySecondClass.second_method"    time.sleep(1)if __name__ == "__main__":    print "::: With a decorated class :::"    z = MySecondClass()    z.first_method()    z.second_method()

 

好处相比函数修饰器要稍微简洁一点(在类有很多方法时)

 

2. 增加类成员

场景:比如统一给所有的模型增加id, created_time属性

# -*- coding:utf-8 -*-def addAttrs(*attrs):    def re_build(cls):        class newClass(cls):            def __init__(self,*args, **kws):                for attr in attrs:            setattr(self, attr, None)                self.__id = id                super(newClass, self).__init__(*args, **kws)        return newClass    return re_build@addAttrs('id', 'created_time')class DBModelOne(object):    def __init__(self, *args, **kwargs):        passif __name__=='__main__':    m = DBModelOne(5)    print m.id, m.created_time

 

or

# -*- coding:utf-8 -*-import timedef cd(cls):    def init(*args, **kwargs):        cls_obj = cls(*args, **kwargs)        setattr(cls_obj, 'id', time.time())        return cls_obj    return init@cdclass A(object):    def __init__(self, name, age, sex='f'):        self.name=name        self.age=age        self.sex=sex    def s(self):        print self.idif __name__=='__main__':    print type(A)#
a=A('Alice', 22) print type(a)#
print a#<__main__.A object at 0x7fe617baa690> print a.name, a.age, a.sex#Alice 22 f a.s()

 

 

转载请注明来自:http://www.cnblogs.com/Tommy-Yu/p/5457751.html

 

转载于:https://www.cnblogs.com/Tommy-Yu/p/5457751.html

你可能感兴趣的文章
巡风源码阅读与分析---nascan.py
查看>>
LiveBinding应用 dataBind 数据绑定
查看>>
Linux重定向: > 和 &> 区别
查看>>
nginx修改内核参数
查看>>
【欧拉函数模板题】最大公约数
查看>>
C 筛选法找素数
查看>>
TCP为什么需要3次握手与4次挥手(转载)
查看>>
IOC容器
查看>>
织梦仿站第三课:网站的文件分割
查看>>
Windows 2003全面优化
查看>>
URAL 1002 Phone Numbers(KMP+最短路orDP)
查看>>
web_day4_css_宽度
查看>>
用sql删除数据库重复的数据的方法
查看>>
学习笔记21—PS换图片背景
查看>>
electron入门心得
查看>>
格而知之2:UIView的autoresizingMask属性探究
查看>>
Spring3.0 AOP 具体解释
查看>>
我的Hook学习笔记
查看>>
EasyUI DataGrid 中字段 formatter 格式化不起作用
查看>>
海量数据存储
查看>>