如何在 Python 2.x 中对对象执行自省?

Posted

技术标签:

【中文标题】如何在 Python 2.x 中对对象执行自省?【英文标题】:How Do I Perform Introspection on an Object in Python 2.x? 【发布时间】:2010-10-07 11:25:27 【问题描述】:

我正在使用 Python 2.x,我有一个从以太中召唤的物体;关于它的文档不是特别清楚。我希望能够获得该对象的属性列表以及每个属性的类型。

同样,我还想获取该对象的方法列表,以及我可以找到的有关该方法的任何其他信息,例如参数数量及其各自的类型。

我感觉我只是在 Google 搜索中遗漏了正确的术语。并不是说我想脱离细节,但它是 Active Directory,所以这总是很有趣。

【问题讨论】:

【参考方案1】:

“Guide to Python introspection”是一篇很好的文章,可以帮助您入门。

【讨论】:

不是很深的文章。【参考方案2】:

您可以查看inspect module。它提供了多种工具来检查活动对象以及源代码。

【讨论】:

【参考方案3】:

如果您使用的是 win32com.client.Dispatch,检查 Python 对象可能没有多大帮助,因为它是 IDispatch 的通用包装器。

您可以使用makepy(Activestate Python 附带)从类型库生成 Python 包装器。然后你可以看一下包装器的代码。

【讨论】:

【参考方案4】:

怎么样:

>>> o=object()
>>> [(a,type(o.__getattribute__(a))) for a in dir(o)]
[('__class__', <type 'type'>), ('__delattr__', <type 'method-wrapper'>), 
('__doc__', <type 'str'>), ('__format__', <type 'builtin_function_or_method'>),
('__getattribute__', <type 'method-wrapper'>), ('__hash__', <type 'method-wrapper'>),
('__init__', <type 'method-wrapper'>), 
('__new__', <type 'builtin_function_or_method'>),
('__reduce__', <type 'builtin_function_or_method'>),
('__reduce_ex__', <type 'builtin_function_or_method'>),
('__repr__', <type 'method-wrapper'>), ('__setattr__', <type 'method-wrapper'>),
('__sizeof__', <type 'builtin_function_or_method'>),
('__str__', <type 'method-wrapper'>),
('__subclasshook__', <type 'builtin_function_or_method'>)]
>>> 

更结构化的方法是使用inspect module:

inspect 模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块、类、方法、函数、回溯、框架对象和代码对象。例如,它可以帮助您检查类的内容、检索方法的源代码、提取和格式化函数的参数列表,或者获取显示详细回溯所需的所有信息。

【讨论】:

这对于 getattribute 的东西来说是相当讨厌的。使用内置的 getattr() 会好很多。 随意将 o.__getattribute__(a) 替换为 getattr(o,a)【参考方案5】:

嗯...您的第一站将是一个简单的目录(对象)。这将显示所有对象的成员,包括字段和方法。在交互式 Python shell 中尝试一下,然后试一试。

例如:

> class Foo:
   def __init__(self):
    self.a = "bar"
    self.b = 4711

> a=Foo()
> dir(a)
['__doc__', '__init__', '__module__', 'a', 'b']

【讨论】:

我确实尝试了 dir,但我没有看到一些我知道可用的属性。它是一个 Active Directory 对象(ADsNameSpaces、GetObject),我希望看看“sn”、“cn”等各种属性是否在列表中,但它们不在。也许我为此选择了错误的对象。

以上是关于如何在 Python 2.x 中对对象执行自省?的主要内容,如果未能解决你的问题,请参考以下文章

Python 自省:如何获取对象属性的“未排序”列表?

python基础

python学习之自省/反射

Python自省与反射

Python的自省机制

Python的自省机制与Python 的反射机制