一部のクラスがabcクラス(抽象基本クラス)を拡張する場合、すべての抽象メソッドを定義しない限り、インスタンス化できません。しかし、多くの場合、Decorator パターンを実装するときは、いくつかの抽象メソッドだけを定義し、その他は装飾されたオブジェクトに委譲するだけです。これを行う方法?
たとえば、次のコードを機能させたいと考えています。
from abc import ABCMeta, abstractmethod
class IElement(object):
__metaclass__ = ABCMeta
@abstractmethod
def click(self):
return
@abstractmethod
def hover(self):
return
# ... more IElement's abstractmethods...
class StandardElement(IElement):
def click(self):
return "click"
def hover(self):
return "hover"
# ... more implemented IElement's methods...
class MyElement(IElement):
def __init__(self, standard_element):
self._standard_element = standard_element
delegate(IElement, standard_element)
def click(self):
return "my click"
assert MyElement(StandardElement()).click() == 'my click'
assert MyElement(StandardElement()).hover() == 'click'
それ以外の
from abc import ABCMeta, abstractmethod
class IElement(object):
__metaclass__ = ABCMeta
@abstractmethod
def click(self):
return
@abstractmethod
def hover(self):
return
# ... more IElement's abstractmethods...
class StandardElement(IElement):
def click(self):
return "click"
def hover(self):
return "hover"
# ... more implemented IElement's methods...
class MyElement(IElement):
def __init__(self, standard_element):
self._standard_element = standard_element
def click(self):
return "my click"
def hover(self):
return self._standard_element.hover()
# ... more manually delegated IElement's methods to self._standard_element object, aggregated in initialiser...
assert MyElement(StandardElement()).click() == 'my click'
assert MyElement(StandardElement()).hover() == 'click'
このために、delegate
上記の例のメソッドを実装する必要があります。それを実装する方法は?abc クラスを拡張するクラスの自動委譲を提供する他のいくつかのアプローチも検討される場合があります。
PSここで解決策として継承()を提案しないでくださいclass MyElement(StandardElement)
...上記のコードは単なる例です。私の実際のケースでは、MyElement は StandardElement とはかなり異なります。それでも、誰かが StandardElement の代わりに MyElement を使用することになっている場合があるため、MyElement を StandardElement と互換性のあるものにする必要があります。ここでは、「is a」ではなく「has a」関係を実装する必要があります。