Adapter/Adaptee pattern
pythiusプロジェクトのaop.pyも使ってみたが、
独自の実装でAdapterパターン with AOP
from types import FunctionType from __future__ import nested_scopes import sys if sys.version_info[0:2] < (2,2): sys.exit(1) def AdapterTo(adaptee): def _implement_new_api(_adapter, adaptee): for name,value in _adapter.items(): if type(value) is FunctionType: setattr(_adaptee, name, value) def _check_interface(_interface, _adapter): for name in _interface.keys(): if not _adapter.has_key(name): raise NotImplementedError(name) class _Meta_Adapter(type): def __new__(cls, class_name, bases, class_dict): # クラス定義読み込み時にInterfaceをチェックする。 # _check_iterface(bases[0].__dict__, class_dict) _implement_new_api(bases[0].__dict__, adaptee) _implement_new_api(class_dict, adaptee) return _Meta_Adapter class Screen: """This is Adaptee role class""" def outputToStdout(self, msg): print msg class Printer: """This is an interface""" def output(self, *args): raise NotImplementedError class PrinterScreenAdapter(Printer): __metaclass__ = AdapterTo(Screen) def output(self, msg): self.outputToStdout(msg) if __name__ == '__main__': screen = Screen() screen.output("Hello")
AdapterToが、adapteeクラスを引数に取って
Adapteeクラスを拡張するようなメタ・クラスを返す関数。
__new__は、クラス定義時のホック・メソッド。
このメタクラスを__metaclass__に持つクラスが''定義された時''に
__new__が呼び出される。インスタンス生成時に呼び出されるのは __init__
PrintScreenAdapterでは、クラス定義時にメソッドをScreenクラスに
追加している。(インスタンスは作成出来ない)
ここまで書いて疑問が浮かび上がってきた。