【问题标题】:How to identify whether a variable is a class or an object如何识别变量是类还是对象
【发布时间】:2009-11-26 09:11:14
【问题描述】:

我正在编写一个小框架,用于在 Python 中为我的项目创建测试装置。在这个我想知道一个特定的变量是某个类的实例还是一个类本身,如果它是一个类,我想知道它是否是我的框架定义的某个类的子类。我该怎么做?

class MyBase(object):
    pass

class A(MyBase):
    a1 = 'Val1'
    a2 = 'Val2'

class B(MyBase):
    a1 = 'Val3'
    a2 = A

我想知道属性 a1 和 a2 是类/类型的实例(a1 是 B 中的字符串类型)还是类对象本身(即 a2 是 B 中的 A)。你能帮我看看如何找到这个吗?

【问题讨论】:

  • 为什么看不到源码?您的来源有什么问题?
  • 这是什么意思?你的意思是我应该阅读源代码,解析它并找出答案?我想在运行时以编程方式和动态地找出答案。如何通过阅读源代码来实现这一点?

标签: python


【解决方案1】:

使用inspect module

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

例如,如果对象是类,inspect.isclass() 函数会返回 true:

>>> import inspect
>>> inspect.isclass(inspect)
False
>>> inspect.isclass(inspect.ArgInfo)
True
>>> 

【讨论】:

  • +1 不知道这个,比isinstance的替代品好多了
  • 非常感谢。我也不知道这件事。对我有很大帮助。我正在使用这个和 inklesspen 和 abyx 给出的解决方案的组合。感谢大家的解决方案
【解决方案2】:

使用isinstancetypetypes.ClassType(后者用于老式类):

>>> isinstance(int, type)
True

>>> isinstance(1, type)
False

【讨论】:

    【解决方案3】:

    使用type() 函数。它将返回对象的类型。您可以从 types 库中获取要匹配的“库存”类型。旧式类(不继承任何东西)的类型为types.ClassType。像您示例中的新型类具有types.TypeType 类型。这个模块中还有很多其他有用的类型,用于字符串等。

    在旧式类的实例上调用 type() 会返回 types.InstanceType。在新样式类的实例上调用它会返回该类本身。

    【讨论】:

      【解决方案4】:

      使用 type()

      >>> class A: pass
      >>> print type(A)
      <type 'classobj'>
      >>> A = "abc"
      >>> print type(A)
      <type 'str'>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多