你已经通过我对术语的使用发现我是一个python n00b。
直截了当的问题:
我怎样才能在交互式python shell中看到特定对象的方法列表,就像我可以在ruby中一样(你可以在ruby irb中用对象后面的'.methods'做到这一点)?
答案 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>
会显示该对象的可用属性列表。