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

Bor*_*jaX 11 python types class 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()):
    # ... #
Run Code Online (Sandbox Code Playgroud)

而作为type(parameter)回报<type 'instance'>,并type(Class1())<type 'instance'>为好,事实证明,即使参数为Class2中的一个实例,它是进入第一比较...

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

谢谢!!:)

Ign*_*ams 16

旧式课程就是这么做的.从object他们的定义中派生您的类.


Way*_*ner 10

你应该真的使用isinstance:

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

In [27]: foo(x)
<type 'instance'>
True
Run Code Online (Sandbox Code Playgroud)

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

  • `isinstance`当然通常比直接`type()`检查更好,而且肯定是你正在使用的类型检查形式,你实际上为每个检查实例化了一个`Class1()`是不可取的.然而,该文章所说的是,在许多情况下,检查类型**(无论您使用哪种方法)都是不良编码实践的标志.IMO这篇文章是无用的宗教信仰,并且仍然有用于类型检查,但是如果你对你自己定义的类型进行"数十次"检查,这听起来像一个潜在的"不够面向对象"的代码味道. (2认同)

Ale*_*lli 9

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

不过,不要使用旧式的类,除非你被迫维护一堆旧的遗留代码(没有一个好的测试套件让你有信心尝试切换类o).当一个类没有"自然"基础时,将其从而object不是从任何时候进行子类化.或者,您的模块位于顶部,可以设置

__metaclass__ = type
Run Code Online (Sandbox Code Playgroud)

它将默认从古老的旧式类更改为闪亮的新式类 - 虽然显式继承object通常是首选("显式优于隐式"),模块 - 全局设置__metaclass__可能会感觉"对现有的旧模块的侵入性较小,你可以将它从旧类转换到新类,因此它可以作为一种可能性.