首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3类装饰器,应用于方法

Python 3类装饰器,应用于方法
EN

Stack Overflow用户
提问于 2015-12-12 01:08:23
回答 1查看 1.2K关注 0票数 0

正如标题所述,我正在寻找一种修饰类的方法,这样当我调用方法时,装饰器就会应用于该调用。这背后的主要原因是允许我捕获函数调用及其传递的参数。我不会沿着装饰单个方法的传统道路走下去的原因是,这些方法可能不会提前知道,因为这些类将通过插件进行扩展。我也对人们可能遇到这个问题的其他实现持开放态度。

代码语言:javascript
复制
from functools import wraps


def echo(fh):
    def func_wrapper(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            ret = func(*args, **kwargs)
            if ret is None:
                ret = "empty"
            fn_calls = []
            if args:
                fn_calls.append([func.__name__, args, ret])
            elif kwargs:
                fn_calls.append([func.__name__, kwargs, ret])
            else:
                raise ArgumentError
            collector(fh, fn_calls)
        return wrapper
    return func_wrapper

因此,将上面的修饰符应用于一个类而不是一个方法。

伪代码示例:

代码语言:javascript
复制
@echo(file_)
class Foo(object):
    def __init__(self):
        pass

    def bar(self, name):
        print("this is %s" % name)
-----
foo = Foo()
foo.bar("baz")

这将返回如下内容:'foo.bar','baz','None‘

先谢谢你...

EN

回答 1

Stack Overflow用户

发布于 2015-12-12 09:39:49

如果你不喜欢元类,你可以使用类装饰器:

代码语言:javascript
复制
import functools

def _echoit(file, func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        file.write('Echoing func %s\n' % func.__name__)
        file.write('Echoing args %\n' % args)
        file.write('Echoing kwargs %s\n' % kwargs)
        return func(*args, **kwargs)
    return wrapper

def echo(file):
    def decorator(cls):
        attrs = vars(cls)
        for k in list(attrs.keys()):
             if callable(attrs[k]):
                 attrs[k] = _echoit(attrs[k], file)
        return cls
    return decorator

@echo(file_)
class Foo(object):
    def __init__(self):
        pass

    def bar(self, name):
        print("this is %s" % name)

foo = Foo()
foo.bar("baz")

如果这是针对插件系统的,那么具有自定义元类的基类在将来可能会更具可扩展性,并且允许您拥有需要覆盖的自定义抽象方法,等等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34228854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档