【发布时间】:2014-08-01 13:09:14
【问题描述】:
我试图从 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'
是否有一些解决方法如何注入所有类,还是我必须坚持使用像 dir 这样的全局函数?
【问题讨论】:
-
您可以使用
dir()列出对象具有的所有方法,例如dir(some_object)(编辑:好的,我知道你已经知道了;) -
@James 我知道,它在示例
methods_grep函数中使用。我需要一个对所有对象都可用的函数,它返回所有可用的方法过滤由作为参数给出的模式。 -
@James 例如
str.mgrep('split')将返回['_formatter_field_name_split', 'rsplit', 'split', 'splitlines']。 -
您可能会使用
mock模块来伪造它,尽管除了处理mgrep方法之外,设置一个Mock将所有内容委托给原始object类型可能有点冒险也是。
标签: python inheritance python-3.x metaprogramming monkeypatching