Cpython 是如何实现继承这个特性的?

2017-01-17 17:01:25 +08:00
 noobsheldon
比较好奇继承特性的实现,但是搜到的观点是:继承就是 copy and paste. 但是子类的__dict__中并不存在父类的方法名称。如何能确定它的继承机制呢?有看过 C 源码的大牛能解释下吗?
2639 次点击
所在节点    Python
15 条回复
zhuangzhuang1988
2017-01-17 17:19:52 +08:00
ryd994
2017-01-17 17:42:53 +08:00
难道不是先尝试自己的方法列表,找不到就直接找到父类然后由父类处理么?
noobsheldon
2017-01-17 20:13:32 +08:00
@ryd994 假设有一父类 A:
class A(object) :
def prt(self) : print type(self)
还有一子类 B ,继承 A
class B(A) :pass
B().prt ()输出说明此时 self 代表 B 类实例。继承过程是怎样使得 prt 的 self 指向 B 实例的?
noobsheldon
2017-01-17 20:16:35 +08:00
wwqgtxx
2017-01-17 21:24:27 +08:00
@noobsheldon 如果从纯 python 的角度解释就是
B.__dict__.update(A.__dict__)
然后再执行你的自定义语句
noobsheldon
2017-01-17 21:41:11 +08:00
@wwqgtxx B. __duct__中并没有 A.__dict__的内容
wwqgtxx
2017-01-17 22:21:38 +08:00
@noobsheldon 他在他的内部执行就行了,不一定要表现出来呀
wwqgtxx
2017-01-17 22:30:41 +08:00
而且你上面说到的
继承过程是怎样使得 prt 的 self 指向 B 实例的
self 本身就是一种指针, python 解析器实际上是调用 A.prt(self)的,所以这种实现是自然而然的
glogo
2017-01-17 23:09:59 +08:00
直接翻开 Python 源码看吧
ryd994
2017-01-18 02:43:23 +08:00
@noobsheldon 你只看到 self 不代表解释器只看到 self
解释器内部变量多一个而已
更何况 self 其实是解释器在运行时给赋值的一个参数,把 self 全部换成 foo bar 一样能用
deleted
2017-01-18 08:55:10 +08:00
Cython 不是 cpython 吧
noobsheldon
2017-01-18 09:23:10 +08:00
@deleted 这只是叫法问题啊!也有叫 Cpython 的啊
noobsheldon
2017-01-18 09:24:15 +08:00
@ryd994 不是这个意思,我知道随便换个名字都能用!
wwqgtxx
2017-01-18 20:24:48 +08:00
@deleted cython 和 cpython 是两个完全不一样的东西,前者是一个用 C 和 Python 混合编程的工具,后者是 Python 解析器的 C 语言实现,请不要混淆概念
deleted
2017-01-19 01:40:35 +08:00
@wwqgtxx 还真是这样的

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

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

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

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

© 2021 V2EX