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

在看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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(1)
刘奇

Le paramètre

de __new()__attrs est à l'origine un dictionnaire, il n'y a donc pas de génération. Cela ajoute simplement de nouveaux éléments au dictionnaire original.

Les métaclasses sont différentes des classes ordinaires dans le sens où elles produisent des objets de classe, tandis que les classes ordinaires produisent des objets d'instance. Dans la métaclasse, name, bases et attrs représentent respectivement 类名, 基类 et 类属性. La structure de classe réelle n'est composée que de ces trois

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

Le __init__ et le self._name ici appartiennent tous deux à attrs. Vous ne pouvez donc transmettre aucun paramètre.

À mon avis, le rôle de la métaclasse est plutôt orienté vers le filtrage, elle peut formuler des règles. Lorsque la classe est réellement utilisée, elle vérifiera d'abord si la métaclasse est définie. Sinon, la métaclasse native, c'est-à-dire type, sera appelée.

Vous pouvez consulter la documentation officielle

Ce qui précède est ma compréhension. Il peut y avoir des écarts. Les corrections sont les bienvenues et grandement appréciées.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal