查找Python对象具有的方法

给定一个任何types的Python对象,是否有一个简单的方法来获取该对象所有方法的列表?

要么,

如果这是不可能的,是否至less有一个简单的方法来检查是否有一个特定的方法,而不是简单地检查方法被调用时是否发生错误?

看来你可以使用这个代码,用你感兴趣的对象replace“对象”: –

[method_name for method_name in dir(object) if callable(getattr(object, method_name))] 

我在这个网站发现了它,希望能提供一些更多的细节!

您可以使用内置的dir()函数来获取模块所有属性的列表。 尝试在命令行看到它是如何工作的。

 >>> import moduleName >>> dir(moduleName) 

此外,可以使用hasattr(module_name, "attr_name")函数来查明模块是否具有特定属性。

有关更多信息,请参阅Python内省指南 。

最简单的方法是使用dir(objectname)。 它将显示该对象的所有可用方法。 酷招。

要检查它是否有一个特定的方法:

 hasattr(object,"method") 

除了更直接的答案之外,如果我没有提到iPython的话,我将会失职。 点击“标签”查看可用的方法,自动完成。

一旦你find了一个方法,请尝试:

 help(object.method) 

查看pydocs,方法签名等

啊… REPL 。

如果你特别想要的方法 ,你应该使用inspect.ismethod 。

对于方法名称:

 import inspect method_names = [attr for attr in dir(self) if inspect.ismethod(getattr(self, attr))] 

对于这些方法本身:

 import inspect methods = [member for member in [getattr(self, attr) for attr in dir(self)] if inspect.ismethod(member)] 

有时候, inspect.isroutine也是有用的(对于内置的C扩展,没有“绑定”编译器指令的Cython)。

我相信你想要的是这样的:

一个对象的属性/方法列表

恕我直言,内置函数dir()可以为你做这个工作。

 $ python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> a = "I am a string" >>> dir(a) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] 

在我检查你的问题时,我决定编写一个脚本,以便更好地格式化和演示dir()的输出。

开始:

list_objects_methods.py

 #!/usr/bin/python OBJ = "I am a string." COUNT = 0 for method in dir(OBJ): print "| {0: <20}".format(method), COUNT += 1 if COUNT == 4: COUNT = 0 print 

希望我有贡献:)。

这里指出的所有方法的问题是,你不能确定一个方法不存在。

在Python中,可以拦截通过__getattr____getattribute__调用的点,从而可以在“运行时”创build方法

例:

 class MoreMethod(object): def some_method(self, x): return x def __getattr__(self, *args): return lambda x: x*2 

如果你执行它,你可以调用对象字典中不存在的方法…

 >>> o = MoreMethod() >>> o.some_method(5) 5 >>> dir(o) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'some_method'] >>> o.i_dont_care_of_the_name(5) 10 

这就是为什么你比 Python中的许可模式更容易地请求原谅 。

可以创build一个getAttrs函数,它将返回一个对象的可调用属性名称

 def getAttrs(object): return filter(lambda m: callable(getattr(object, m)), dir(object)) print getAttrs('Foo bar'.split(' ')) 

那会回来

 ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] 

没有可靠的方法列出所有对象的方法。 dir(object)通常是有用的,但在某些情况下可能不会列出所有的方法。 根据dir()文档 : “有了一个参数, 试图返回该对象的有效属性列表。”

如上所述callable(getattr(object, method))检查该方法是否可以通过callable(getattr(object, method))

…至less有一个简单的方法来检查它是否有一个特定的方法,而不是简单地检查方法被调用时是否发生错误

虽然“ 容易要求宽恕而不是允许 ”当然是Pythonic的方式,但你也许正在寻找:

 d={'foo':'bar', 'spam':'eggs'} if 'get' in dir(d): d.get('foo') # OUT: 'bar'