python2.7 - 关于python 元类的理解
PHP中文网
PHP中文网 2017-04-17 14:22:09
[Python讨论组]
class SettingMeta(object):
    def __new__(cls,*args,**kwargs):
        import pdb;pdb.set_trace()
        print "new"
        return super(SettingMeta1,cls).__new__(cls,*args,**kwargs)
    def __init__(self,*args):
        print "init"

Setting = SettingMeta('Setting', (object,), {})
class Bind(Setting):
    action = "append"
    def add1(self):
        print "123"

此时Setting 是SettingMeta的实例,为什么加载Bind的时候会调用SettingMeta.new?
不太理解。。。

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
巴扎黑

不知道怎么搞的,Python 就是这么个逻辑。

reference/datamodel.html#determining-the-appropriate-metaclass 这节,第三点,「or」后半句:

[if] bases are defined, then the most derived metaclass is used

你别的都没做,只定义了一个父类,所以 Python 就拿它的的 __class__ 当元类用。但是它不是个类啊,所以它的 __class__ 不是 type,而是你的 SettingMeta。于是 SettingMeta 就成这个 Bind 类的元类了……

具体代码见 Python/bltinmodule.c 里的 __build_class__ 内建函数的实现(链接到的地方就是你的 __new__ 被调用的地方)。

我用的是 Python 3 的代码。不过估计 Python 2 那边也是差不多的。

PS: markdown 反人类啊 :-(

黄舟

元类体现在哪里?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号