查找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'