8

是否可以在 python 中检查对象是否是类对象。IE 如果你有

class Foo(object):
    pass

您如何检查 o 是 Foo(或其他类)还是 Foo 的实例(或任何其他类实例)?在 Java 中,这将是一件简单的事情。只需检查对象是否是 Class 的实例。python中有类似的东西还是你应该不在乎?

稍微澄清一下:我正在尝试制作一个函数来打印有关其给定参数的信息。所以如果你传入 o,其中 o = Foo() 它会打印出关于 Foo 的信息。如果你传入 Foo 它应该打印出完全相同的信息。不是关于类型的信息。

4

4 回答 4

9

使用isinstance内置函数。

>>> o = Foo()
>>> isinstance(o, Foo)
True
>>> isinstance(13, Foo)
False

这也适用于子类:

>>> class Bar(Foo): pass

>>> b = Bar()
>>> isinstance(b, Foo)
True
>>> isinstance(b, Bar)
True

是的,通常情况下,您不应该特别关心对象是什么类型。相反,您只需调用您想要的方法,o以便人们可以插入符合您接口的任意对象。如果您要积极检查您正在使用的对象的类型,这是不可能的。这个原则被称为鸭式打字,它允许你在选择如何编写代码时有更多的自由。

isinstancePython 是实用的,所以如果它对您的特定程序有意义,请随意使用。

编辑:

要检查某个变量是类还是实例,您可以这样做:

>>> isinstance(Foo, type)   # returns true if the variable is a type.
True
>>> isinstance(o, type)
False
于 2013-08-28T22:55:20.260 回答
3

我的最终目标是创建一个函数,如果它是一个实例,它会打印出关于一个对象的信息,如果它是一个类,它会打印一些不同的东西。所以这次我很在意。

首先,了解类实例——它们是类型的实例:

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

因此,您可以通过这种方式挑选类,但请记住,类也是实例。(因此,您可以将类传递给函数,从函数返回它们,将它们存储在列表中,即时创建......)

于 2013-08-28T23:04:29.967 回答
0

我必须像 Thanatos 所说的那样检查 isinstance(Foo, type) 但是对于旧的类类型,您还必须执行 isinstance(Foo, types.ClassType)

于 2013-08-28T23:15:16.573 回答
0

isinstance() 函数

isinstance(o, Foo)

你也可以用它来o比较object

In [18]: class Foo(object): pass

In [20]: o_instance = Foo()

In [21]: o_class = Foo

In [22]: isinstance(o_instance, Foo)
Out[22]: True

In [23]: isinstance(o_class, Foo)
Out[23]: False

In [24]: isinstance(o_instance, object)
Out[24]: True

In [25]: isinstance(o_class, object)
Out[25]: True
于 2013-08-28T22:55:42.413 回答