前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python:类与装饰器

python:类与装饰器

作者头像
超级大猪
发布2019-11-21 20:31:27
6060
发布2019-11-21 20:31:27
举报

简单装饰

在python中,装饰器可以是一个类。就是这么任性。 要把一个类做为装饰器是很简单的。这里借鉴一个很有意思的代码,python管道语法糖的实现,作者JulienPalard 项目

class Pipe:
    def __init__(self, function):
        self.function = function
        functools.update_wrapper(self, function)

    def __ror__(self, other):
        return self.function(other)

    def __call__(self, *args, **kwargs):
        return Pipe(lambda x: self.function(x, *args, **kwargs))

可以这么用:

@Pipe
def average(iterable):
    """
    Build the average for the given iterable, starting with 0.0 as seed
    Will try a division by 0 if the iterable is empty...
    """
    total = 0.0
    qte = 0
    for x in iterable:
        total += x
        qte += 1
    return total / qte

[1, 3, 6] | average

神奇啊,神奇啊。我一看这份代码,就爱上了这个简洁的小项目。真是太有BG了。 但是,这个项目有一个小问题。那就是,它不能装饰类方法。

装饰类方法

类的函数和普通函数非常相似,在调用的时候会以self关键字传入当前实例作为参数。这是大家都明白的。 但值得一提的是,类函数有比较复杂的调用机制,当执行 cls.method的一瞬间,系统会调用该方法(注意不是类)的__get__(self, instance, cls)函数。instance就是所属类的实例,cls是类的签名。 所以当用上面Pipe类直接装饰一个类方法,将会丢失类的self关键字。要实现功能,必须获取运行时的instance实例,要获取instance,就必须hack__get__函数。 所以,代码变化成了下面这样:

import functools


class Pipe:
    def __init__(self, function):
        self.function = function
        functools.update_wrapper(self, function)

    def __ror__(self, other):
        return self.function(other)

    def __get__(self, instance, cls):
        return Pipe(lambda x: self.function(instance, x))

要点如下: 1. 在get中是一个经过实例包装的pipe类实例。这个实例包装了instance。 2. 这个成员必须是Pipe类型,否则,普通的Lambda方法或者函数,没有实现xor,自然也不能和|连用。

这个类装饰器,也兼容普通的函数,因为普通函数不会触发__get__方法。所以,行为与原项目一致。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-05-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单装饰
  • 装饰类方法
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档