Pythonでの例
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/06 12:23 UTC 版)
Pythonの組み込み(ビルトイン)クラス type はメタクラスである。次に示す単純なPythonのクラスについて説明する。 class Car(object): __slots__ = ['make', 'model', 'year', 'color'] def __init__(self, make, model, year, color): self.make = make self.model = model self.year = year self.color = color @property def description(self): """ このCarの説明を返す """ return "%s %s %s %s" % (self.color, self.year, self.make, self.model) このコードを実行した時、Car は type のインスタンスになっている。上記の Car クラスのソースコードには __init__ メソッドが Car のインスタンスが生成されるたびに呼ばれるといった細々としたことは記述されていない。メタクラスが用意されていない言語ではこのような振る舞いは言語仕様で定義されており、変更することは不可能である。Pythonではメタクラス type がこれらの動作を決定しており、type の代わりに違うメタクラスを使用することでこれらの振る舞いを変更することが可能である。 上に示した例は4つの属性 make と model、year、color の辺りが冗長である。メタクラスを使えば、この冗長さを取り除くことが可能である。Pythonではメタクラスは type のサブクラスとして定義するのが最も簡単である。 class AttributeInitType(type): def __call__(self, *args, **kwargs): """ 新しいインスタンスを生成する """ # 普通にインスタンスを生成する obj = type.__call__(self, *args) # 生成したインスタンスの属性を設定する for name in kwargs: setattr(obj, name, kwargs[name]) # 生成したインスタンスを返す return obj このメタクラスはインスタンスの生成を上書きしているだけで、他の機能はまだ type が処理している。 さて、このメタクラスを用いて Car クラスを書き直すことが可能である。Python 2ではクラス定義中で __metaclass__ にこのメタクラスを代入すればよい(Python 3では代わりに metaclass=M と名前付き引数として与える)。 class Car(object): __metaclass__ = AttributeInitType __slots__ = ['make', 'model', 'year', 'color'] @property def description(self): """ Return a description of this car. """ return "%s %s %s %s" % (self.color, self.year, self.make, self.model) これで、Car のインスタンスを次のように生成できる。 cars = [ Car(make='Toyota', model='Prius', year=2005, color='green'), Car(make='Ford', model='Prefect', year=1979, color='blue')]
※この「Pythonでの例」の解説は、「メタクラス」の解説の一部です。
「Pythonでの例」を含む「メタクラス」の記事については、「メタクラス」の概要を参照ください。
- Pythonでの例のページへのリンク