Python のメタクラス

Pocket

# -*- coding: utf-8 -*-

""" カスタマイズしたメタクラスの例
    プロパティへのアクセスをロギングする
"""
class MyTracer(type):
    """ メタクラスがクラスを初期化するためのコンストラクタ
    """
    def __init__(cls, name, bases, dct):
        # 親メタクラスに、クラスを初期化してもらう
        super(MyTracer, cls).__init__(name, bases, dct)

        # ロギングできる __getattribute__ メソッドを作り、クラスに組み込む
        def logging(self, key):
            print "%s was accessed." % key
            return super(cls, self).__getattribute__(key)
        cls.__getattribute__ = logging

""" MyTracer によってクラスを作らせると、
    プロパティにアクセスされる度にロギングされる
"""
class TestClass(object):
    # メタクラスの指定
    __metaclass__ = MyTracer

    def hello(self):
        self._first_sentence()
        self._second_sentence()

    def _first_sentence(self):
        print "Hi."

    def _second_sentence(self):
        print "How do you do?"


if __name__ == '__main__':
    test = TestClass()
    test.hello()

出典

Pythonを始めよう(3/5):CodeZine

投稿者紹介

株式会社ユニキャスト
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください