|
オブジェクト指向プログラミングにおいてメタクラスとは、インスタンスがクラスとなるクラスのことである。通常のクラスがそのインスタンスの振る舞いを定義するように、メタクラスはそのインスタンスであるクラスを、そして更にそのクラスのインスタンスの振る舞いを定義する。全てのオブジェクト指向プログラミング言語でメタクラスが利用できるわけではない。利用できるものの中でもクラスの振る舞いが定義できる範囲は様々である。各言語はそれぞれ独自のメタオブジェクトプロトコル(MOP)を備えている。メタオブジェクトプロトコルとは、クラスそのものの挙動をもオブジェクト指向のルールで記述し、初期化やインスタンス化のルール、実行状態の管理などをカスタマイズする機構である。Smalltalk、CLOSが代表的である。 ==Pythonでの例== Pythonの組み込み(ビルトイン)クラス type はメタクラスである〔IBM Metaclass programming in Python, parts 1 , 2 and 3 〕〔Artima Forum: Metaclasses in Python 3.0 (part 1 of 2) (part 2 of 2) 〕。次に示す単純なPythonのクラスについて説明する。class Car(object): __slots__ = '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) # 生成したインスタンスを返す return obj このメタクラスはインスタンスの生成を上書きしているだけで、他の機能はまだ type が処理している。さて、このメタクラスを用いて Car クラスを書き直すことが可能である。Python 2ではクラス定義中で __metaclass__ にこのメタクラスを代入すればよい(Python 3では代わりに metaclass=M と名前付き引数として与える)。class Car(object): __metaclass__ = AttributeInitType __slots__ = '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') 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「メタクラス」の詳細全文を読む スポンサード リンク
|