python - 为什么可以在函数定义中用a['xxx'] = 'ooo'的方式创建字典?
高洛峰
高洛峰 2017-04-17 17:50:53
[Python讨论组]

在看python教程的时候发现这个元类定义

class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)

__new__方法里面的这句attrs['add'] = lambda self, value: self.append(value)
为什么直接生成了一个字典?
对于一个元类,它的__new__方法一定是传这四个参数,而不像类的__new__方法可以传cls外任意参数吗

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
怪我咯

__new()__attrs参数本来就是一个字典,所以没有生成一说。只是在原有的字典基础上添加一些新的元素而已。

元类不同于一般的类,它所产生的是类对象,而普通的类产生的是实例对象。元类中namebasesattrs分别代表类名基类类属性。实际类的结构也就这三样

class B(A):
    def __init__(self, name):
        self._name = name

这里的__init__self._name都属于attrs。所以不能传任意参数。

在我看来,元类的作用更倾向于过滤,它可以制定规则。在实际使用类的时候,会先检查是否定义了元类,如果没有则会调用原生的元类即type

你可以看看官方文档

以上是我的一点理解,也许有偏差,欢迎指正不胜感激。

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

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