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クラスに
追加している。(インスタンスは作成出来ない)


ここまで書いて疑問が浮かび上がってきた。

  • Adapteeを継承したAdapterを作り、そちらを使ってはいけないの?(デザインパターンではそうしてきた)
  • Python(や、他の動的スクリプト言語)では、メソッドに別名を与える事が出来る。(前の日記で示した通り)