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 中,everything 是 object
的一个实例。包括类型、类、函数和许多其他你不希望成为对象的东西。
【参考方案1】:
object
是类层次结构的根,所以它是每个类型的最终父类,包括type
和object
。这使得object
成为它自己的父类,这也是你不能单独在Python 中定义object
的原因之一;它必须被 Python 实现拖着踢和尖叫。
type
是一个类,所有(内置)类都是元类type
的实例。 (是的,type
是它自己的元类。)由于object
是type
的基类,因此type
是object
的一个实例。
【讨论】:
你说的都对,和我的理解一样。但这不是我问题的答案。我知道每种类型“都是”对象(通过继承)。我的问题是为什么类型'是对象的实例'。有两种关系——“是一个”和“是实例”。前者为真。为什么后者是真的? 因为它是type
的一个实例(type
是它自己的元类),并且与父类为object
的任何其他实例一样,它本身就是@ 的(间接)实例987654336@.
不错!知道了。所以问题基本上是类型是它自己的元类。这一点都知道。现在这是有道理的。赞成你的回答。谢谢。【参考方案2】:
Python 中的一切都是对象。默认情况下,所有对象都是 object 超类的实例,因此 instance(type, object
返回 True
object 类位于对象层次结构的顶部。即使 A 是 B 的直接子代(在下面的示例中)并且两者都是 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
object 是 object 的一个实例。
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,则返回True
的isinstance()方法的全部代码逻辑或实现。
【讨论】:
以上是关于isinstance(type, object) = True,为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
python-基础-isinstance(p_object, class_or_type_or_tuple)