

Pythonを勉強中なのですが、メタクラスという概念が出てきました。  
メソッドの動作を変更するという認識であっておりますでしょうか。  
そうであれば、継承との違いを教えて頂ければ幸いです。


CC BY-SA 3.0
2015-09-14T10:22:33.837
16594
2015-09-14T14:41:38.650
7918
question
python
メタクラスと継承の違いについて教えてください


`__new__`の動作を置き換えるものではないでしょうか?

>
> objectを継承した新スタイルクラスに`__metaclass__`というアトリビュートが設定されていると，クラスは特別な動きをします。クラス生成時に，`__metaclass__`のアトリビュートに設定されたクラスを起動し，`__new__()`メソッドを呼び出すのです。

<http://coreblog.org/ats/lerning-metaclass-by-reading-javascript-like-
prototype-in-python/>

さらに、

>
> `type.__new__()`で作ってクラスアトリビュートを割り当てられたクラスは，`Prototype`クラス，およびそのサブクラスの実体として機能します。

とあり、`__metaclass__`を使うことにより、上記ページの例では同じ`TestClass`から作られたインスタンスは同じPrototypeを共有できているのだと思います。


CC BY-SA 3.0
2015-09-14T11:59:20.790
16598
2015-09-14T11:59:20.790
5246
16594
answer


メタクラスは、クラスの雛形です。  
クラスは、インスタンスの雛形です。

クラスの実装が違えばインスタンスの挙動は変わります。  
クラスを継承して異なる実装を与えた場合、その継承クラスのインスタンスは、継承元クラスのインスタンスと事なる挙動になります。

クラスの元になるメタクラスとして、標準では type が使われます。  
typeがクラスの挙動を決めています。  
一般的なクラスの挙動とは、クラス実装によってメソッドを定義できたり、インスタンス化する毎に異なるメモリを割り当てられる、とったものです。

メタクラスとしてtype以外を指定した場合、「一般的なクラスの挙動」ではない動作を行わせることができます。インスタンス化をなんどしても同じメモリをもつインスタンスを生成したり、クラスにメソッド定義をしてもメソッドを見えなくしたり、あるいは、メソッドや属性値の定義順に意味を持たせたり、などです。

  * クラス継承は、継承元の一部の実装を変更するために行います
  * メタクラスの変更は、Pythonにおけるクラス定義の解釈そのものを変更するために行います


CC BY-SA 3.0
2015-09-14T14:41:38.650
16605
2015-09-14T14:41:38.650
806
16594
answer