捕获未知的魔法方法调用?

时间:2017-08-18 19:08:48

标签: python

我有一个课程,我想覆盖各种方法,例如__str____iter__len。但是,所有这些方法的实现都是相同的。例如,我可能会有这样的事情:

def __len__(self):
    return list.__len__(self.do_something())

def __str__(self):
    return str(self.do_something())

def __iter__(self):
    return list.__iter__(self.do_something())

def items(self):
    return (self.do_something()).items()

我的想法是捕获方法或魔术方法,并在执行do_something后(在一种包装函数中)调用它们。有没有办法做到这一点?或者也许有其他解决方案?

1 个答案:

答案 0 :(得分:3)

如果你真的想要封装所有“魔法”方法,你可以使用装饰器和元类。

import functools


def magic_decorator(func):
    @functools.wraps(func)
    def func_wrapper(*args, **kwargs):
        ...
        return func(*args, **kwargs)
    return func_wrapper


class WrappedMagicMeta(type):

    def __new__(cls, name, bases, attrs):
        for k, v in attrs.items():
            if k.startswith('__') and k.endswith('__') and callable(v):
                attrs[k] = magic_decorator(v)

        return type.__new__(cls, name, bases, attrs)


class MyCustomObject(metaclass = WrappedMagicMeta):
    pass

您将实施MyCustomObject func_wrapperPOST job魔术方法所需的任何功能。