isinstance(type, object) = True,为啥? [复制]

Posted

技术标签:

【中文标题】isinstance(type, object) = True,为啥? [复制]【英文标题】:isinstance(type, object) = True, why? [duplicate]isinstance(type, object) = True,为什么? [复制] 【发布时间】:2018-11-03 03:32:08 【问题描述】:

我知道 object 是 type 的一个实例,type 继承自 object。所以下面的关系是有意义的:

isinstance(object, type)            # returns True, ok
issubclass(type, object)            # returns True, ok

我也知道 isinstance(a,b) 检查 a 是否是 b 或其基的实例。因此,以下内容也很有意义:

isinstance(type, type)              # returns True because it is translated to ....
isinstance(type, object)            # which is True

我无法理解的是为什么以下语句返回 True。

isinstance(type, object)            # returns True, but why?
isinstance(object, object)          # returns True, but why?

如果你知道,请告诉我。谢谢。

【问题讨论】:

object 是一种类型,因此是type 的一个实例。它也是object 的一个实例,因为它是一个对象。欢迎使用 Python。 在处理元类型时,事情可能会变得混乱。 @IgnacioVazquez-Abrams,object 是一种类型,因此是类型的实例 同意并与我的理解相同。 并且它(对象)也是对象的实例 对象(类)是对象,还是它的实例对象()是对象? 所有类型都是对象。 在 Python 中,everythingobject 的一个实例。包括类型、类、函数和许多其他你不希望成为对象的东西。 【参考方案1】:

object是类层次结构的根,所以它是每个类型的最终父类,包括typeobject。这使得object 成为它自己的父类,这也是你不能单独在Python 中定义object 的原因之一;它必须被 Python 实现拖着踢和尖叫。

type 是一个类,所有(内置)类都是元类type 的实例。 (是的,type 是它自己的元类。)由于objecttype 的基类,因此typeobject 的一个实例。

【讨论】:

你说的都对,和我的理解一样。但这不是我问题的答案。我知道每种类型“都是”对象(通过继承)。我的问题是为什么类型'是对象的实例'。有两种关系——“是一个”和“是实例”。前者为真。为什么后者是真的? 因为它是type 的一个实例(type 是它自己的元类),并且与父类为object 的任何其他实例一样,它本身就是@ 的(间接)实例987654336@. 不错!知道了。所以问题基本上是类型是它自己的元类。这一点都知道。现在这是有道理的。赞成你的回答。谢谢。【参考方案2】:

Python 中的一切都是对象。默认情况下,所有对象都是 object 超类的实例,因此 instance(type, object 返回 True

object 类位于对象层次结构的顶部。即使 AB 的直接子代(在下面的示例中)并且两者都是 object 的间接子代。

isinstance() 方法的编码方式是,如果两个参数都是 object,它会返回 True。在其他情况下,它会检查第一个参数是否是第二个参数的实例。

请看下面的代码示例。

class A:
       pass

class B(A):
        pass

a = A()
b = B()

print(isinstance (a, A)) # True
print(isinstance (b, B)) # True
print(isinstance (b, A)) # True
print(isinstance (a, B)) # False

print(isinstance (a, object)) # True
print(isinstance (b, object)) # True
print(isinstance (A, object) ) # True
print(isinstance (B, object)) # True

objectobject 的一个实例。

print(isinstance (object, object)) # True

A 不是 A 的实例,B 也是如此。

print(isinstance (B, B)) # False
print(isinstance (A, A)) # False

以下代码抛出错误,因为第二个参数应该是类的名称。

print(isinstance (a, a)) 
"""
print(isinstance (a, a)) 
TypeError: isinstance() arg 2 must be a type or tuple of 
types
"""

print(isinstance (b, b)) 
"""
print(isinstance (b, b)) 
TypeError: isinstance() arg 2 must be a type or tuple of  
types
"""

因此,如果两个参数都是object,则返回Trueisinstance()方法的全部代码逻辑或实现。

【讨论】:

以上是关于isinstance(type, object) = True,为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python-基础-isinstance(p_object, class_or_type_or_tuple)

python 内建函数isinstance的用法以及与type的区别

python 之isinstance用法

Pyhtontype 与 isinstance 用法详解

Python isinstance

用type动态创建Form