isinstance()方法在python 3中返回错误答案

时间:2018-07-13 06:27:45

标签: python python-3.x types isinstance

看下面的代码:

a = 3
type(a) == object
False
isinstance(a, object)
True

这将如何解释?

您的建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

一切都是Python中的对象,其中包括整数,字符串,函数和类。因此,isinstance(a, object)将返回您True。但是3实际上是一个integer,是从sub_class创建的object。因此,type(a)只能等于int

我可以举个例子。

假设我们有两个类,Sub是Base的子类。

class Base:
    def __init__(self):
        self.kappa='kappa'
class Sub(Base):
    def __init__(self):
        super().__init__()

obj=Base()
int_rino=Sub()


print(isinstance(obj,Base))
print(isinstance(obj,Sub))
print(isinstance(int_rino,Base))
print(isinstance(int_rino,Sub))


print(type(int_rino)==Base)

结果将是:

True
False
True
True
False

答案 1 :(得分:2)

这是大多数支持继承的面向对象语言的常用构造。当子类(在您的情况下为int)继承于父类(在您的情况下为object)时,则被称为具有“是”关系。也就是说,int (或 an object

isinstance正在检查这种“是”关系。从文档中:

  

如果 object 参数是 classinfo 参数或其(直接,间接或虚拟)子类的实例,则返回true。

有一个类似的issubclass函数来检查类的相同关系,而不是该类的实例。实际上,在大多数情况下,isinstance(x, y) == issubclass(type(x), y)

type返回构造对象的确切类。这意味着检查type(3) == object等同于检查int == object。希望你能看到那无疑是错误的。

在相关的切线上,在解释程序的给定运行范围内,类应始终是相同的引用,因此可以使用is而不是==进行比较。因此type(3) is int将是正确的。这样,==便会为您可能遇到的所有类型实现。