python shell的方法列表?

时间:2009-09-04 12:29:08

标签: python shell interactive

你已经通过我对术语的使用发现我是一个python n00b。

直截了当的问题:

我怎样才能在交互式python shell中看到特定对象的方法列表,就像我可以在ruby中一样(你可以在ruby irb中用对象后面的'.methods'做到这一点)?

9 个答案:

答案 0 :(得分:20)

现有答案可以很好地向您展示如何获取对象的属性,但不能准确回答您提出的问题 - 如何获取对象的方法。 Python对象具有统一的命名空间(与Ruby不同,其中方法和属性使用不同的命名空间)。考虑例如:

>>> class X(object):
...   @classmethod
...   def clame(cls): pass
...   @staticmethod
...   def stame(): pass
...   def meth(self): pass
...   def __init__(self):
...     self.lam = lambda: None
...     self.val = 23
... 
>>> x = X()
>>> dir(x)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__',
 '__getattribute__', '__hash__', '__init__', '__module__',
 '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
 'clame', 'lam', 'meth', 'stame', 'val']

((为便于阅读而分割输出))。

如您所见,这将为您提供所有属性的名称 - 包括许多仅从object继承的特殊方法,特殊数据属性,例如__class____dict____doc__,每个实例的数据属性(val),每个实例的可执行属性(lam),以及实际的方法。

如果您需要更具选择性,请尝试:

>>> import inspect
>>> [n for n, v in inspect.getmembers(x, inspect.ismethod)]
['__init__', 'clame', 'meth']

标准库模块inspect是在Python中进行内省的最佳方式:它建立在内置的内省钩子(例如dir和更高级的内核)之上,为您提供有用的功能,丰富而简单的内省服务。例如,在这里,您看到只显示了由此类专门设计的实例和类方法 - 不是静态方法,不是可调用或不可调用的实例属性,而不是从object继承的特殊方法。如果您的选择性需求略有不同,则可以轻松构建自己的ismethod调整版本并将其作为getmembers的第二个参数传递,以便根据您的确切需求定制结果。

答案 1 :(得分:10)

dir( object )

会给你清单。

例如:

a = 2
dir( a )

将列出您可以调用整数的所有方法。

答案 2 :(得分:5)

>>> help(my_object)

答案 3 :(得分:5)

对于您创建的任何对象,它都很简单

dir(object)

它将返回对象的所有属性的列表。

答案 4 :(得分:4)

Python也支持制表符完成。我更喜欢我的python提示符清理(所以不用感谢IPython),但是选项卡完成。

在.bashrc中设置或类似:

PYTHONSTARTUP=$HOME/.pythonrc

将它放在.pythonrc:

try:
    import readline
except ImportError:
    print ("Module readline not available.")
else:
    print ("Enabling tab completion")
    import rlcompleter
    readline.parse_and_bind("tab: complete")

每次python提示启动时都会打印“启用标签完成”,因为最好是明确的。这不会干扰python脚本和程序的执行。


示例:

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

答案 5 :(得分:3)

对于dir()的增强版,请查看see()

>>> test = [1,2,3]
>>> see(test)
    []    in    +    +=    *    *=    <    <=    ==    !=    >    >=    hash()
    help()    iter()    len()    repr()    reversed()    str()    .append()
    .count()    .extend()    .index()    .insert()    .pop()    .remove()
    .reverse()    .sort()

你可以在这里得到它:

答案 6 :(得分:2)

这样做:

dir(obj)

答案 7 :(得分:2)

其他人提到dir。让我谨慎一点:Python对象可能定义了__getattr__方法,当试图在所述对象上调用未定义的方法时,会调用该方法。显然dir没有列出所有那些(无限多个)方法名称。一些图书馆明确使用此功能,例如PLY(Python Lex-Yacc)。

示例:

>>> class Test:
...     def __getattr__(self, name):
...         return 'foo <%s>' % name
...
>>> t = Test()
>>> t.bar
'foo <bar>'
>>> 'bar' in dir(t)
False

答案 8 :(得分:0)

如果您只想要方法,那么

def methods(obj):
    return [attr for attr in dir(obj) if callable(getattr(obj, attr))]

但是尝试IPython,它有对象属性的标签完成,所以输入obj.<tab>会显示该对象的可用属性列表。