いくつかのクラスがabcクラス(抽象基本クラス)を拡張する場合、すべての抽象メソッドを定義しない限り、そのインスタンスをインスタンス化できません。しかし、しばしばデコレータパターンを実装する際に、私はいくつかの抽象メソッドしか定義しません。それ以外は装飾オブジェクトに委譲します。これを行う方法?例えばPython abcクラスを拡張するクラスの自動委譲
、私は次のコードの仕事をしたい:
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クラスを拡張するクラスに対して自動委任を提供するための他のアプローチも考えられます。
P.S. ここに解決策として継承(class MyElement(StandardElement)
)を提案しないでください...上記のコードは単なる例です。私の実際のケースでは、MyElementはStandardElementと比べてかなり異なっています。それでも、StandardElementの代わりにMyElementを使用することがあるため、MyElementをStandardElementと互換性を持たせる必要があります。私は実際には "ここで"関係を持っている必要があります。
「StandardElement」は抽象クラスであると考えられていますか? – Fomalhaut
No.StandardElementはIElementの実装です。 IElementは抽象クラスです... – yashaka