home changes contents help options

249:メソッドを委譲する

普通にメソッドを委譲するコードは次のようになります。

# coding: utf-8

  class A(object):
      def output(self, string):
          print string

  class B(object):
      u"""普通の委譲"""
      def __init__(self):
          self.a = A()

      def output(self, string):
          return self.a.output(string)

メソッドもただのオブジェクトであることを利用すると、次のようなコードにすることもできます。

class C(object):
    u"""少しひねってみる"""
    def __init__(self):
        self.a = A()
        self.output = self.a.output

委譲するメソッドが多数ある場合、 __getattr__ メソッドが役に立ちます。

class D(object):
    u"""D 自身が持たない属性値(メソッド含む)を A に自動委譲"""
    def __init__(self):
        self.a = A()

    def __getattr__(self, name):
        return getattr(self.a, name)

この D クラスは自身が持たない属性値すべてを A に委譲してしまいます。 この処理が過剰である場合は次のように制限します。

class E(object):
    u"""E 自身が持たない属性値(メソッド含む)で、
    かつ、 delegate に含まれるものを A に自動委譲"""
    delegate = ('output',)

    def __init__(self):
        self.a = A()

    def __getattr__(self, name):
        if name in self.delegate:
            return getattr(self.a, name)
        raise AttributeError

参考