2013-08-28 97 views
2

是否有可能在python中检查对象是否为类对象。也就是说,如果你有检查类对象

class Foo(object): 
    pass 

你怎么能检查是否o是美孚(或其他类)或富的一个实例(或任何其它类的实例)?在Java中这将是一件简单的事情。只要检查对象是否是Class的一个实例。 Python中是否有类似的东西,或者你应该不关心?

稍微澄清:我试图做一个函数,打印有关参数给定的信息。所以如果你传入o,那么o = Foo()会打印出关于Foo的信息。如果您传入Foo,则应打印出完全相同的信息。不是关于Type的信息。

+2

有时,您应该尽量不关心确切的类型,而是该对象支持您需要的接口。请参阅“鸭子打字”。如果我用一个完全像'Foo'的东西来调用你的函数,为什么拒绝我的调用?然而,有时候,你确实需要知道一个对象是否是实例,并且看到答案。 – Thanatos

+2

“我试图看看它是一个实例还是一个类,不仅仅是它是一个特定类的实例。”一切都是一个实例,包括类。 'type'的类实例,即'instance(Foo,type)== True'。你可以用这种方式挑选它们,但这通常不是必需的。 – Thanatos

+0

你不应该在意。人们不应该将方钉插入圆孔中。如果他们尝试,将会出现一个非常明显的异常,并且作为程序员,您应该记录以防止其他人首先尝试它。 – TehTris

回答

6

使用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上调用所需的方法,以便人们可以插入符合您界面的任意对象。如果你要积极地检查你正在使用的对象的类型,这是不可能的。这个原则被称为duck typing,并且允许您在选择编写代码的过程中更加自由。

虽然Python很实用,但如果对您的特定程序有意义,请随时使用isinstance

编辑:

要检查是否存在变量是一个类VS一个实例,你可以这样做:

>>> isinstance(Foo, type) # returns true if the variable is a type. 
True 
>>> isinstance(o, type) 
False 
+0

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

0

的isinstance()函数

isinstance(o, Foo) 

,你也可以用它来比较oobject

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 
+1

它必须为任何类对象工作。不仅仅是Foo。我试图看看它是一个实例还是一个类。不只是如果它是一个特定类的实例。 – Cadyyan

2

我的最终目标是创建一个函数,打印出关于某个对象的信息,如果该对象的实例和其他类打印出不同的东西。所以这次我很在乎。

首先,要明白类情况 - 他们是类型的实例:

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

所以,你可以挑选出类这种方式,但请记住,类实例了。 (因此,你可以通过类的功能,从函数返回它们将它们存储在列表中,动态创建的...)

0

我不得不做这样托斯说,检查 isinstance(美孚,类型) 但在旧类的情况下,你还必须做 isinstance(Foo,types。ClassType)