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

在看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 はそれぞれ 类名基类类属性 を表します。実際のクラス構成はこの 3 つだけです

リーリー

ここでの __init__self._name はどちらも attrs に属します。したがって、パラメータを渡すことはできません。

私の意見では、メタクラスの役割はフィルタリングの方にあり、ルールを定式化できます。実際にクラスを使用するときは、まずメタクラスが定義されているかどうかを確認します。定義されていない場合は、ネイティブ メタクラス、つまり type が呼び出されます。

公式ドキュメントをチェックアウトできます

上記は私の理解であり、相違がある可能性がありますので、修正を歓迎します。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート