【问题标题】:How to check a variable is class object or not [duplicate]如何检查变量是否是类对象[重复]
【发布时间】:2013-03-28 07:27:15
【问题描述】:

假设一个简单的类:

class MyClass(object):
    pass

.
.
.
m = MyClass
print type(m) # gets: <type 'classobj'>
# if m is classobj, how can i check a variable is class object?

我的问题是:如何检查变量是否为类对象?

一个简单的解决方案:

if str(type(m)) == "<type 'classobj'>":
    # do something

但我认为至少有一种经典的方法可以检查。

【问题讨论】:

  • 您上面显示的代码不会为type(m) 打印&lt;type 'classobj'&gt;,因为m 是一个新型类。它将打印&lt;type 'type'&gt;。对于经典课程,您只会收到 &lt;type 'classobj'&gt;

标签: python class python-2.7


【解决方案1】:

这是你要找的吗?

>>> class A(object):
...    pass
>>> isinstance(A, type)
True

>>> isinstance("asd", type)
False

但仅适用于从对象继承的类。

【讨论】:

  • 我很确定这不是 OP 想要的。
【解决方案2】:

在 2.x 中,类对象可以是 type(新型类)或 classobj(经典类)。 type 类型是内置的,但 classobj 类型不是。那么,你如何得到它?这就是 types 模块的用途。

isinstance(MyClass, (types.TypeType, types.ClassType))

在 3.x 中,您无需担心经典类,因此:

isinstance(MyClass, type)

即使您想直接比较类型,也不应该通过str 比较任何 个对象。比较:

>>> class MyClassicClass:
...     pass
>>> str(type(MyClassicClass)) == "<type 'classobj'>"
True
>>> str("<type 'classobj'>") == "<type 'classobj'>"
True

您几乎总是可以直接比较对象:

>>> type(MyClassicClass) == types.ClassType
True
>>> "<type 'classobj'>" == types.ClassType
False

(在非常罕见的情况下,由于某种原因您确实需要比较字符串表示,您需要repr,而不是str。)

【讨论】:

  • 完美,在此先感谢。
  • 这是一个很好的答案。 +1(如果可以的话,更多)
  • +1。我喜欢 Jochen 的简单回答,但这是一个很好的解释。
  • six 库具有涵盖 Python 2 或 3 的预定义值。请参阅class_types
【解决方案3】:

新样式类(如您的示例中显式派生自 object,或在 Python 3 中隐式派生)不是 classobj 类型。只有旧式类是classobjs。因此,对于您编写的示例类,您可以简单地检查MyClass 是否是type 的实例,因为所有新样式类都是:

isinstance(MyClass, type)

因为所有新式类都派生自object,你也可以这样做:

issubclass(MyClass, object)

我建议不要:

type(MyClass) == type

如果类的类型不是type,而是元类,这将失败。当然,虽然可能会有这样的用例。

如果你真的需要看看你是否有一个老式的类,你可以导入types模块并使用types.ClassType,或者只声明一个老式的类,看看你是不是这个类测试属于同一类型:

class OldStyleClass:
   pass
OldStyleClass = type(OldStyleClass)

isinstance(MyClass, OldStyleClass)

【讨论】:

    【解决方案4】:

    使用inspect:

    import inspect
    print inspect.isclass(obj)
    

    【讨论】:

    • +1 用于检查模块
    • 现在我为什么没想到... (+1)
    • 我不知道我是怎么忘记的,但这是一个比我更好的答案(以及我的等价物)。
    • @abarnert -- 是的,但你的解释了如何这一切都工作,这绝对值得保留。
    • 好的,只要这个被接受。
    【解决方案5】:

    有时下一个正在工作(如果您想确定如何打印对象):

    def is_class(o):
        return hasattr(o, '__dict__')
    

    【讨论】:

    • 大部分对象,包括类,都有这个属性
    • @pylover 对不起,我回答了另一个问题:“如何确定变量是否为类实例”。我同意你。但是你能举一个不是类但有这个属性的对象的例子吗?
    • 不,问题是How to check a variable is class **OBJECT** or not,不是INSTANCE
    • 你的方法总是为类或实例返回真
    • @pylover i = int(5) 是一个object,因为issubclass(int, object)True,但是该方法为整数返回False,因为int 不是真正的用户定义类。所以。它不是真实类的实例。
    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多