V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
noobsheldon
V2EX  ›  Python

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

  •  
  •   noobsheldon · 2017-01-17 17:01:25 +08:00 via Android · 2634 次点击
    这是一个创建于 2867 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比较好奇继承特性的实现,但是搜到的观点是:继承就是 copy and paste. 但是子类的__dict__中并不存在父类的方法名称。如何能确定它的继承机制呢?有看过 C 源码的大牛能解释下吗?
    第 1 条附言  ·  2017-01-18 09:31:35 +08:00
    感谢各位的回复!
    在《 python 源码剖析》中找到了 self 的值的设置(具体 c 的实现)。以及这篇博客中对 PyMethodObject 的说明。
    博客地址: http://m.blog.csdn.net/article/details?id=45288277
    《 python 源码剖析》 306 页
    15 条回复    2017-01-19 01:40:35 +08:00
    zhuangzhuang1988
        1
    zhuangzhuang1988  
       2017-01-17 17:19:52 +08:00
    ryd994
        2
    ryd994  
       2017-01-17 17:42:53 +08:00 via Android
    难道不是先尝试自己的方法列表,找不到就直接找到父类然后由父类处理么?
    noobsheldon
        3
    noobsheldon  
    OP
       2017-01-17 20:13:32 +08:00 via Android
    @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
        4
    noobsheldon  
    OP
       2017-01-17 20:16:35 +08:00 via Android
    wwqgtxx
        5
    wwqgtxx  
       2017-01-17 21:24:27 +08:00 via iPhone
    @noobsheldon 如果从纯 python 的角度解释就是
    B.__dict__.update(A.__dict__)
    然后再执行你的自定义语句
    noobsheldon
        6
    noobsheldon  
    OP
       2017-01-17 21:41:11 +08:00 via Android
    @wwqgtxx B. __duct__中并没有 A.__dict__的内容
    wwqgtxx
        7
    wwqgtxx  
       2017-01-17 22:21:38 +08:00 via iPhone
    @noobsheldon 他在他的内部执行就行了,不一定要表现出来呀
    wwqgtxx
        8
    wwqgtxx  
       2017-01-17 22:30:41 +08:00 via iPhone
    而且你上面说到的
    继承过程是怎样使得 prt 的 self 指向 B 实例的
    self 本身就是一种指针, python 解析器实际上是调用 A.prt(self)的,所以这种实现是自然而然的
    glogo
        9
    glogo  
       2017-01-17 23:09:59 +08:00
    直接翻开 Python 源码看吧
    ryd994
        10
    ryd994  
       2017-01-18 02:43:23 +08:00 via Android
    @noobsheldon 你只看到 self 不代表解释器只看到 self
    解释器内部变量多一个而已
    更何况 self 其实是解释器在运行时给赋值的一个参数,把 self 全部换成 foo bar 一样能用
    deleted
        11
    deleted  
       2017-01-18 08:55:10 +08:00 via Android
    Cython 不是 cpython 吧
    noobsheldon
        12
    noobsheldon  
    OP
       2017-01-18 09:23:10 +08:00 via Android
    @deleted 这只是叫法问题啊!也有叫 Cpython 的啊
    noobsheldon
        13
    noobsheldon  
    OP
       2017-01-18 09:24:15 +08:00 via Android
    @ryd994 不是这个意思,我知道随便换个名字都能用!
    wwqgtxx
        14
    wwqgtxx  
       2017-01-18 20:24:48 +08:00
    @deleted cython 和 cpython 是两个完全不一样的东西,前者是一个用 C 和 Python 混合编程的工具,后者是 Python 解析器的 C 语言实现,请不要混淆概念
    deleted
        15
    deleted  
       2017-01-19 01:40:35 +08:00 via Android
    @wwqgtxx 还真是这样的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2650 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:58 · PVG 13:58 · LAX 21:58 · JFK 00:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.