Subscribed unsubscribe Subscribe Subscribe

SE Can't Code

A Tokyo based Software Engineer. Not System Engineer :(

メタプログラミング

ずっとメタプログラミングについて?が頭の上に浮かんでいて、とりあえず今持っている認識を残したいと思う。

メタプログラミングとは、メタクラスから作られるインスタンスをクラスとして書くことが出来る。つまりクラスがインスタンスを定義するものとすれば、メタクラスはクラスを定義するものである。Pythonではbuiltin関数であるTypeを用いてメタクラスを定義することで機能する。簡単に出来ることと言えば、クラス生成のカスタマイズである。

以下の呼び出しイメージ。

通常classで定義する以下のようなコードを、、

class Spam(x, y):
  spam = value

  def ham(self, args):
    ...

typeを用いることで同様に記述できる。

def ham(self, args):
   ...

Spam = type('Spam',[x,y,],{'spam': value,'ham': ham,})

また、python3系の場合に、type以外を用いてメタクラスを利用する際は以下のように記述する。

class Spam(metaclass=Spam[[x,y,], 'spam'=value,'ham'=ham,]):
   ...

python2系の場合は、metaclassに定義したメタクラスを代入すればいい。

class Spam(type):
    def __new__(metacls, cls_name, bases, attrs):
        cls = type.__new__(metacls, cls_name, bases, attrs)
        return cls

class Ham(object):
    __metaclass__ = Spam

またPythonメタクラスでは、以下代表的なメソッドがある。

type.new(matacls, name, bases, ns, **kwargs)

クラスの定義前に、指定した生成方法でクラスオブジェクトを生成し、返す。

type.init(cls, name, bases, ns, **kwargs)

クラスの定義後に、クラスオブジェクトを初期化し、Noneを返す。

総括


クラスはインスタンスを定義し、 メタクラスはクラスを定義する。

ざっくり終わり。

Remove all ads