在看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
外任意参数吗
怪我咯2017-04-17 17:52:53
__new()__
のattrs
パラメータは元々辞書なので生成はありません。元の辞書にいくつかの新しい要素を追加するだけです。
メタクラスはクラス オブジェクトを生成するのに対し、通常のクラスはインスタンス オブジェクトを生成するという点で通常のクラスとは異なります。メタクラスでは、name
、bases
、attrs
はそれぞれ 类名
、基类
、类属性
を表します。実際のクラス構成はこの 3 つだけです
ここでの __init__
と self._name
はどちらも attrs
に属します。したがって、パラメータを渡すことはできません。
私の意見では、メタクラスの役割はフィルタリングの方にあり、ルールを定式化できます。実際にクラスを使用するときは、まずメタクラスが定義されているかどうかを確認します。定義されていない場合は、ネイティブ メタクラス、つまり type
が呼び出されます。
公式ドキュメントをチェックアウトできます
上記は私の理解であり、相違がある可能性がありますので、修正を歓迎します。