在所有python对象上注入Helper函数?

时间:2014-06-11 12:57:38

标签: python inheritance python-3.x metaprogramming monkeypatching

我试图模仿来自Ruby的methods.grep,它只返回被调用的任何对象(类或实例)的可用方法列表,通过传递给grep的regexp模式进行过滤。 在交互式提示中调查对象非常方便。

def methods_grep(self, pattern):
    """ returns list of object's method by a regexp pattern """
    from re import search
    return [meth_name for meth_name in dir(self) \
            if search(pattern, meth_name)]

由于Python的限制对我来说不太清楚,遗憾的是它不能简单地插入object类祖先:

object.mgrep = classmethod(methods_grep)
# TypeError: can't set attributes of built-in/extension type 'object'

是否有一些解决方法如何注入所有类,或者我是否必须坚持使用像dir这样的全局函数?

2 个答案:

答案 0 :(得分:4)

有一个名为forbiddenfruit的模块,可以修补内置对象。它还允许您撤消更改。你可以在https://pypi.python.org/pypi/forbiddenfruit/0.1.1

找到它
from forbiddenfruit import curse    
curse(object, "methods_grep", classmethod(methods_grep))

当然,在生产代码中使用它可能是一个坏主意。

答案 1 :(得分:2)

AFAIK没有解决方法。我觉得你不能改变内置类很烦人。个人意见。

一种方法是创建一个基础对象并强制所有对象继承它。

但我不认为这个问题是诚实的。你可以简单地使用methods_grep(object, pattern),对吗?你不必将它插入任何地方。