在Python中,如何查看对象的“类型”?

时间:2010-11-04 07:26:06

标签: python

我不知道它是什么类型。如何检查并将其打印到控制台?

5 个答案:

答案 0 :(得分:3)

类型基本上是值类型和对该值有效的操作


type(object) #gives you the type

如果你想测试一个类型


import types
class foo(object):
    pass

>>> foo is types.ClassType # test if foo is a class
True

答案 1 :(得分:2)

调用type()功能。请参阅types模块,以获取可与type()一起使用的类型名称列表。

答案 2 :(得分:1)

type(variable)会告诉你什么类型的东西。

答案 3 :(得分:1)

虽然你可以使用type()进行内省,但我不得不想知道你真正要做的是什么。

在Python中,专注于对象行为...... API ...被认为是更好的做法...而不是类型。

你是否关心手头的物品 Foo() ...或者某些 Foo()的子类或某些对于Foo()的某种代理(某个包含 Foo()的对象 - 如对象并将必要的功能委托给它)吗?

我看到的通常建议是使用Python的异常处理...尝试使用所需的接口,就像对象的类型正确一样,并准备好处理在对象不支持时可能抛出的异常那种用法。 (当然,最常见的是TypeError或AttributeError。)

另一种选择是明智地使用hasattr()来查看对象是否具有像所需对象一样使用的必要属性(通常是方法)。 (主要的警告是,在不相关的对象类中可能存在方法名称冲突与完全不兼容的语义)。

最新版本的Python引入了对“abstract base classes”(ABCs)的支持。这基本上允许您以引用被测对象的预期语义的方式使用isinstance()issubclass(),而不是它们的文字实例化和类层次工件。当与ABC isinstance()一起使用时,返回一个值,该值指示类是否支持被认为是预期语义的确定性的签名方法。

您可以在Python Docs: collections module (section 8.3.6)中了解有关最常用ABC的更多信息。

不幸的是,如果您重复使用某些在现有Python核心或标准库中具有传统含义的方法名称,您仍然可能会混淆ABCs。

例如,如果您创建一些UI类并定义.next()的方法(可能与某些假设.previous()一起使用)。这样做,没有进一步的努力,意味着像isinstance(foo, collections.Iterable)这样的调用将返回 True ,即使您实现的语义(可能类似于继续到UI中的下一页)完全是与 collections.Iterable ABC。

所预期的那些正交

我认为通过创建一些其他抽象基类并特别注册您的类来实现那个抽象,可以消除歧义。但是,我不知道具体如何起作用。

答案 4 :(得分:0)

print object.__class__.__name__

应该做的伎俩。