Python type 和 object 的关系

2019-09-19 15:05:00 +08:00
 Jeeao
type 的基类是 object,而 object 是由 type 生成的? 这怎么理解?求通俗解释
2674 次点击
所在节点    Python
14 条回复
silkriver
2019-09-19 15:26:12 +08:00
type 是用来生成类的类,对象是 type 类或其子类的实例

你可以用 type.mro() 查看任意类型的“方法解析顺序”,这实际上就是类继承顺序,一直上溯到 object 类为止
>>> type.mro(type)
[<class 'type'>, <class 'object'>]
这说明 type 的基类是 object

你可以用 type() 查看任意对象的“类型”,就是一个对象属于什么类型
>>> type(object)
<class 'type'>
这说明 object 是由 type 生成的
wwqgtxx
2019-09-19 15:26:53 +08:00
这个问题基本上等同于 鸡生蛋蛋生鸡 的问题
实际上 object 和 type 在 cpython 中都是用 c 代码生成的,并没有什么先后关系,他们的依赖关系也是通过 c 代码人为规定的
Jeeao
2019-09-19 15:31:11 +08:00
@silkriver 想问的是,为什么需要这样做。
Jeeao
2019-09-19 15:33:09 +08:00
@wwqgtxx 确实不好理解。
Jeeao
2019-09-19 15:35:35 +08:00
@wwqgtxx 需要理解中间的逻辑,只能看底层源码啦
silkriver
2019-09-19 16:04:33 +08:00
从历史上说,先有 type 类,后有 object 类…… 这个问题确实源远流长,只能去看 PEP 啦
XIVN1987
2019-09-19 16:16:08 +08:00
object 是所有类的基类,就像 JAVA 里面 Object 是所有类的基类一样,这个好理解吧,,
type 也是一个类,,那 object 是它的基类,,至少从原理上是说的通的

Python 不同于 JAVA 的一点是,,Python 中的类本身也是对象,,既然是对象,它就是实例,那它是哪个类的实例呢??是 type 这个类的实例(对象),,所以 object 这个类是 type 这个类的实例(对象)
Jeeao
2019-09-19 16:20:26 +08:00
@silkriver 这个疑惑放过了。理解成人为规定,说是这样子设计,是为了方便修改(可能最开始作者对设计的 py 没信心。哈哈哈哈)
xiaket
2019-09-19 16:23:08 +08:00
type 是最基本的 metaclass.
neoblackcap
2019-09-19 16:40:41 +08:00
type 是 metaclass,在以前的版本之前不是所有类都是新式类,所以会出现非 object 派生的类。type 跟 object 的确是不存在先后顺序的,类似的问题在 Java 界也出现,都是靠底层 VM 初始化的时候产生。
你可以简单的理解成,神说要有光,于是便有了光
robinlovemaggie
2019-09-19 19:44:50 +08:00
难道没用过 def 里套 class,class 又套 def ?
Jeeao
2019-09-20 09:45:26 +08:00
@neoblackcap 最后一句点睛之笔 hhh
Jeeao
2019-09-20 09:45:50 +08:00
@robinlovemaggie 答非所问了
sazima
2019-09-20 13:47:11 +08:00
In [1]: issubclass(type, object)
Out[1]: True

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/602176

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX