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

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

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

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

【问题讨论】:

    标签: python introspection python-datamodel


    【解决方案1】:

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

    【讨论】:

    • 不是很深的文章。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      您可以使用makepyActivestate 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”等各种属性是否在列表中,但它们不在。也许我为此选择了错误的对象。
        猜你喜欢
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 1970-01-01
        • 2016-03-09
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多