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