Skip to main content
 首页 » 编程设计

python之在所有 python 对象上注入(inject)辅助函数

2025年05月04日15myhome

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

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' 

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

请您参考如下方法:

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

from forbiddenfruit import curse     
curse(object, "methods_grep", classmethod(methods_grep)) 

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