关于Python中'object'类和'type'类的查询
我有一个关于基于类的面向对象编程(OOP)在动态的Python语言中的问题。下面是一个关于Python类层次结构的图,来自这个链接。
根据这个图,我明白了,Python中的每种数据类型都是一个类。bool
类是object
类的直接子类。当我们创建一个新的用户定义类(比如Natalie
)时,object
类将是这个类的最终祖先。类对象(比如int
、str
、object
)本身也是type
类的实例。在Java中,我们称之为“类的类”,而不是type
类。
我的问题是:
1) 我理解得对吗?
2) 如果对的话,我对从type
到object
类的箭头方向感到困惑。我该如何理解这个?
3) 我无法理解/想象这两个短语(用棕色标出的),请帮我解释一下。
the object class is an instance of the type class and itself
the type class is an instance of the object class and itself
3 个回答
print (isinstance(type,object))
print (type.__class__)
print (isinstance(object,type))
我不知道这对你来说是否比对象更有帮助,但这里有一些经验上的证明。
你的理解基本上是对的。type
和 object
是特别的,因为它们是类型层次结构的基础。所有东西都是 object
的实例。每个类型或类都是 type
的实例。所以 type
是 object
的一个实例,而 object
也是 type
的一个实例。
这意味着继承关系实际上不能用树形结构来表示,因为它们之间有一个循环:type
和 object
是彼此的实例。这种相互继承通常是不可行的,但在 Python 中,这些基本类型就是这样:它们打破了规则。图示有点误导,因为它显示 type
从 object
继承,但反过来却没有。实际上,type
和 object
之间的箭头应该是双向的,表示继承是双向的。
区分类型/类是从什么地方“继承”的,以及它们是“实例”什么的,这一点很重要,尽管在那个图示中没有直接表示。一个类或类型(比如 int
或 Natalie
)是 object
的一个“子类”,但它是 type
的一个“实例”。你在问题 3 中提到的两个说法与此有关。object
类型是 object
的一个实例,因为所有东西都是对象;object
也是 type
的一个实例,因为 object
是一个类型(也就是一个类)。同样,type
是 object
的一个实例,因为所有东西都是对象;而 type
也是 type
的一个实例,因为 type
是一个类型(它是类型的类型,也是用户定义类的类型)。
图示中还有一个不准确的地方:bool
实际上并不是 object
的直接子类,而是 int
的子类(而 int
是 object
的直接子类)。