说说Python的元编程

    提到元这个字,你也许会想到元数据,元数据就是描述数据本身的数据,元类就是类的类,相应的元编程就是描述代码本身的代码,元编程就是关于创建操作源代码(比如修改、生成或包装原来的代码)的函数和类。主要技术是使用装饰器、元类、描述符类。本文的主要目的是向大家介绍这些元编程技术,并且给出实例来演示它们是怎样定制化源代码的行为。

装饰器

    装饰器就是函数的函数,它接受一个函数作为参数并返回一个新的函数,在不改变原来函数代码的情况下为其增加新的功能,比如最常用的计时装饰器:

from functools import wraps 
 
def timeit(logger=None): 
    """ 
    耗时统计装饰器,单位是秒,保留 4 位小数 
    """ 
 
    def decorator(func): 
        @wraps(func) 
        def wrapper(*args, **kwargs): 
            start = time.time() 
            result = func(*args, **kwargs) 
            end = time.time() 
            if logger: 
                logger.info(f"{func.__name__} cost {end - start :.4f} seconds") 
            else: 
                print(f"{func.__name__} cost {end - start :.4f} seconds") 
            return result 
 
        return wrapper 
 
    return decorator 

    (注:比如上面使用 @wraps(func) 注解是很重要的, 它能保留原始函数的元数据) 只需要在原来的函数上面加上 @timeit() 即可为其增加新的功能:

@timeit() 
def test_timeit(): 
    time.sleep(1) 
 
test_timeit() 
#test_timeit cost 1.0026 seconds 

上面的代码跟下面这样写的效果是一样的:

test_timeit = timeit(test_timeit) 
test_timeit() 

装饰器的执行顺序

当有多个装饰器的时候,他们的调用顺序是怎么样的?

假如有这样的代码,请问是先打印 Decorator1 还是 Decorator2 ?

from functools import wraps 
 
def decorator1(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
        print('Decorator 1') 
        return func(*args, **kwargs) 
    return wrapper 
 
def decorator2(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
        print
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值