如果某些类扩展了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相比是非常不同的东西。不过,我必须让MyElement与StandardElement兼容,因为有时候有人应该使用MyElement而不是StandardElement。我真的需要在这里实现“有一个”关系,而不是“是一个”。
'StandardElement'应该是抽象类吗? – Fomalhaut
StandardElement是IElement的实现。 IElement是抽象类... – yashaka