12

通过我对术语的使用,您已经发现我是 python n00b。

直截了当的问题:

我如何在交互式 python shell 中查看特定对象的方法列表,就像在 ruby​​ 中一样(您可以在 ruby​​ irb 中在对象后添加“.methods”)?

4

9 回答 9

22

现有答案很好地向您展示了如何获取对象的属性,但不能准确回答您提出的问题 - 如何获取对象的方法。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,以根据您的精确需求定制结果。

于 2009-09-04T14:42:50.713 回答
10

dir( object )

会给你名单。

例如:

a = 2
dir( a )

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

于 2009-09-04T12:29:57.480 回答
6

对您创建的任何对象执行此操作都很简单

dir(object)

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

于 2014-04-09T17:09:05.127 回答
5
>>> help(my_object)
于 2009-09-04T12:30:51.690 回答
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(
于 2009-09-04T14:01:30.677 回答
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()

你可以在这里得到它:

于 2009-09-04T13:25:31.420 回答
2

做这个:

dir(obj)
于 2009-09-04T12:30:22.033 回答
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
于 2009-09-04T12:37:55.717 回答
0

如果你只想要方法,那么

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

但一定要试试 IPython,它有对象属性的制表符补全,所以键入obj.<tab>会显示该对象上可用属性的列表。

于 2009-09-04T12:44:40.787 回答