你应该已经发现了我的术语,我是Python的n00b。Python shell的方法列表?
直截了当的问题:
我怎么能看到的特定对象的方法列表中的交互式Python外壳就像我在红宝石(你可以做,在红宝石IRB与后一个”。方法目的)?
你应该已经发现了我的术语,我是Python的n00b。Python shell的方法列表?
直截了当的问题:
我怎么能看到的特定对象的方法列表中的交互式Python外壳就像我在红宝石(你可以做,在红宝石IRB与后一个”。方法目的)?
现有的答案做你展示如何得到一个对象的属性的一个不错的工作,但不准确回答您提出的问题 - 如何获得方法的一个对象。 Python对象具有统一的名称空间(与Ruby不同,在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
的第二个参数传递,以便根据您的确切需求量身定制结果。
dir(object)
会给你的列表中。
例如:
a = 2
dir(a)
将列出了所有你能要求一个整数的方法。
这样做:
dir(obj)
>>> help(my_object)
这实际上并不正确。帮助用于显示方法的文档字符串文档。例如帮助(string.upper)。 dir(obj)是需要的。 – mikej 2009-09-04 12:38:31
正确。如果需要在Ruby中使用.methods,则dir(...)是正确的答案。 – 2009-09-04 12:39:34
对于交互式使用(OP的用例),这实际上是最好的方法。帮助系统将打印出my_object的文档,包括所有广告方法的列表(不管它们是否有自己的文档字符串)。它不会显示名称以'_'开头的方法,但这通常是可以的,因为这些方法是用于类的内部使用。 – alexis 2015-10-01 15:50:50
其他人所说的dir
。让我留心一下:Python对象可能有一个定义的方法,当你试图调用一个未定义的方法时,它会被调用。显然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
...并从这个问题进行Ruby类比,Ruby类可能会覆盖method_missing,当尝试调用未定义的方法时会调用它,当然obj.methods无法知道要使用的方法名称由method_missing处理。 – mikej 2009-09-04 12:46:17
@mikej:谢谢!我没有Ruby的经验,但是当我写下我的答案时,我确实认为Ruby应该具有相同的功能。 – Stephan202 2009-09-04 12:53:53
如果你想只有方法,然后
def methods(obj):
return [attr for attr in dir(obj) if callable(getattr(obj, attr))]
但不要尝试IPython的,它有标签完成对物体属性,因此打字obj.<tab>
显示您的可用列表该对象的属性。
空闲支持tab-completion以及 – SilentGhost 2009-09-04 12:54:51
对于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()
你可以在这里得到它:
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脚本和程序的执行。
例子:
>>> 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(
+1 tab完成使标准提示变得更愉快;我不知道为什么它默认不是。如果你想避免设置一个STARTUP,你也可以把代码放在你的sitecustomize.py中(尽管在这种情况下你会省掉打印)。请注意,Windows和Mac用户默认情况下不会有readline,需要下载适合的模块,如pyreadline(Win)或readline.py(Mac)。 – bobince 2009-09-04 15:04:05
使用sitecustomize.py它可能会影响python应用程序,而.bashrc中的PYTHONSTARTUP使得它只会在从命令行启动时导入readline。这是如果我正确理解sitecustomize.py。 – u0b34a0f6ae 2009-09-04 16:02:26
它会的,如果他们使用[raw_] input()。不过,这通常更有可能成为一件有用的事情。 – bobince 2009-09-04 23:56:40
其简单的为您创建
dir(object)
它会返回对象的所有属性的列表中的任何对象做到这一点。
作品!谢谢 – potlee 2009-09-04 13:42:08