recherche

Maison  >  Questions et réponses  >  le corps du texte

python - 为什么可以在函数定义中用a['xxx'] = 'ooo'的方式创建字典?

在看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外任意参数吗

高洛峰高洛峰2887 Il y a quelques jours356

répondre à tous(1)je répondrai

  • 怪我咯

    怪我咯2017-04-17 17:52:53

    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.

    répondre
    0
  • Annulerrépondre