在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
属性将普通函数变成元类。