为什么type(classInstance)返回'instance'?

时间:2010-06-24 13:58:50

标签: python class types instance

我有一个方法接受一个可以是几种类型的参数,并且必须根据类型做一件事或者其他事情,但如果我检查所述参数的类型,我就不会得到'真实'类型,我总是得到<type 'instance'>,这与我的比较混乱。

我有类似的东西:

from classes import Class1
from classes import Class2
# Both classes are declared in the same file.
# I don't know if that can be a problem         #
# ... #
def foo(parameter)
    if (type(parameter) == type(Class1()):
    # ... #
    elif (type(parameter) == type(Class2()):
    # ... #

type(parameter)返回<type 'instance'>type(Class1())也是<type 'instance'>时,事实证明即使参数是Class2的一个实例,它也会进入第一次比较...

顺便说一句,str(parameter.__class__)正确显示classes.Class1。我想我总是可以使用它,但我想了解发生了什么......我已经做了十分之一的比较,并且所有这些都正常工作......

谢谢!! :)

3 个答案:

答案 0 :(得分:16)

旧式课程就是这样做的。从他们的定义中的object中派生您的课程。

答案 1 :(得分:10)

你应该真的使用isinstance:

In [26]: def foo(param):
   ....:     print type(param)
   ....:     print isinstance(param, Class1)
   ....:

In [27]: foo(x)
<type 'instance'>
True

对于内置类型,类型更好。

答案 2 :(得分:9)

type(x)为遗留的所有实例x返回相同类型对象的事实,即旧式类,是这类类的许多令人愤怒的缺陷之一 - 不幸的是它们有为了向后兼容的原因,在Python 2.*中留下(并且是没有基类的默认值)。

尽管如此,不要使用旧式类,除非你被迫维护一堆旧的遗留代码(没有一个好的测试套件让你有信心尝试切换类型o课程)。当一个类没有“自然”基础时,将其从object继承,而不是从无。或者,您的模块位于顶部,可以设置

__metaclass__ = type

将默认从古老的旧式类更改为闪亮的新式类 - 而显式继承object通常是首选(“显式优于隐式”), __metaclass__的模块全局设置可能会对您从旧类转换到新类的现有旧模块感觉“侵入性较小”,因此可以提供它。