首页   注册   登录
 zpoint 最近的时间轴更新

zpoint

V2EX 第 303997 号会员,加入于 2018-03-28 11:06:43 +08:00
今日活跃度排名 7448
cpython 底层实现笔记
  •  7   
    Python  •  zpoint  •  4 天前  •  最后回复来自 zpoint
    71
    zpoint 最近回复了
    更正一下错别字

    调用 MyMeta.__new__ 生成一个类, 这里生成的类名称叫做 MyClass, __new__ 是上面你自己定义的, 其中你调用了 type.__new__(cls, name, bases, attr), 这一步会把 attr 中的值都复制到 MyClass 对应的属性中, attr 只是个字典
    @telnetning 这位老哥已经解答了, 我再补充下


    执行到如下这行的时候

    class MyClass(object, metaclass=MyMeta):

    会调用 type(MyMeta).__call__ 去创建这个类, 这个 __call__ 函数在 C 里面的流程可以

    简单的理解为 1. 调用 MyMeta.__new__ 生成一个类, 叫做 MyClass, __new__ 是上面你自己定义的, 其中你调用了 type.__new__(cls, name, bases, attr), 这一步会把 attr 中的值都复制到 MyMeta 对应的属性中, attr 只是个字典而已

    2. 判断一下 issubclass(type(MyClass), MyMeta) 是否为 True, 是的话再调用一下 type(MyClass).__init__(MyClass, name, bases, attr), 这里你没有写任何代码处理 attr 和自身属性的关联, 同样的, attr 还是同一个字典

    到这里, 类已经创建完了, 接下来创建实例, 过程类似
    区别就是 __new__ 你写了一行代码 type.__new__(cls, name, bases, attr) 创建了一个类, 创建的过程中会把 attr 中的值都复制到新创建的类中对应的属性上

    而 __init__ 你没有做对应的操作


    还有, metaclass 的 __new__ 的第一个参数应该是 mcs, 为你定义的 metaclass 本身
    而 metaclass 的 __init__ 的第一个参数应该是 cls, 为 metaclass 的 __new__ 函数创建并返回的新的类, 并不是 metaclass 本身 你定义的时候重名了
    4 天前
    回复了 zpoint 创建的主题 Python cpython 底层实现笔记
    @chaleaochexist 不同的人技能树不太一样, 花多点时间说不定你可以做的更好😂
    @boywhp [Facepalm] 赞同看源码提升快🤝🤝
    @telnetning 相互学习🤝
    4 天前
    回复了 zpoint 创建的主题 Python cpython 底层实现笔记
    @ruyuejun @crudboy @lCC1984 谢谢 O(∩_∩)
    支持一下国内友人~
    37 天前
    回复了 zpoint 创建的主题 Python cpython 底层实现笔记
    @Harz @forever139 @hjq98765 @jamesliu96 Thanks♪(・ω・)ノ
    支持下有痣青年 O(∩_∩)O
    47 天前
    回复了 zpoint 创建的主题 Python cpython 底层实现笔记
    @86091566 ♪(・ω・)
    47 天前
    回复了 zpoint 创建的主题 Python cpython 底层实现笔记
    @wsgws thanks
    @berry10086 @86091566 ProcessOn (^o^)
    47 天前
    回复了 zpoint 创建的主题 Python cpython 底层实现笔记
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2119 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 11ms · UTC 09:06 · PVG 17:06 · LAX 02:06 · JFK 05:06
    ♥ Do have faith in what you're doing.