看下面的代码:
a = 3
type(a) == object
False
isinstance(a, object)
True
这将如何解释?
您的建议将不胜感激。
答案 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
将是正确的。这样,==
便会为您可能遇到的所有类型实现。