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

在Python 3中,isinstance()方法返回错误答案,python,python-3.x,types,isinstance,Python,Python 3.x,Types,Isinstance,请看以下代码: a = 3 type(a) == object False isinstance(a, object) True 如何解释这一点?Python中的所有内容都是对象,包括int、字符串、函数和类。因此,isinstance(a,object)将返回您的True。但是3实际上是一个整数,它是从对象创建的子类。因此,type(a)只能等于int 我可以给你举个例子 假设我们有两个类,Sub是基的Sub_类 class Base: def __init__(self):

请看以下代码:

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

如何解释这一点?

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

我可以给你举个例子

假设我们有两个类,Sub是基的Sub_类

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

这是大多数支持继承的面向对象语言中的常见构造。当一个子类(在您的情况下)从父类(在您的情况下)继承时,它被称为具有“is-a”关系。也就是说,
int
是一个(或一个
对象

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

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

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

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


在相关切线上,在给定的解释器运行中,类应该始终是相同的引用,因此可以使用
is
而不是
=
进行比较。因此
类型(3)为int
将为true。这就是如何为您可能遇到的所有类型实现
=

对象是基类。类型是元类。@Mad Physicator,已删除。对象是基类。int是object的一个子类。您可以在这里查看。
a
属于
int
类型,
int
对象的子类。当您使用
isinstance(object,classinfo)
方法时,您会考虑子类,而使用
type(object)
方法通常会返回与以下相同的值:
object.\uu class\uuu
属性。Python建议使用
isinstance(object,classinfo)
测试类型的方法。根据您的术语,我猜您将基类和元类混淆得更好。我觉得我今天早些时候写的那句话“一切都是python中的一个对象”的重点完全相同。我建议去掉多余的逗号,好的,先生。我错了。我的措辞略有不同::)答案很好,但是不要反对
class
instance
,因为类是Type@Florian. 我不会说我反对实例和类型。当然,您是对的,所有类都是其元类的一个实例(元类不必是
类型
,甚至不必继承元类)。然而,我觉得这是一种迂腐的细节,OP目前不需要也可能无法处理。另外,请记住像
issubclass
isinstance
这样的函数需要一个类或类的元组作为其第二个参数。所以,不管元类是什么,类在这里都有特殊的用途。@Florian。我真正想说的是“如果你愿意的话,请向上投票”:)我已经向上投票了,通过编辑,它非常清楚和准确:)我不准确,默认情况下类是
类型的实例,但这不一定是真的。(例如:在大多数使用元类作为工厂模式的API中)这让我现在开始思考。我想知道我是否可以通过点击
\uuuu init\uuuuuu
\uuuu new\uuuuuu
属性将普通函数变成元类。