Если какой-либо класс расширяет класс abc (абстрактный базовый класс), то я не могу его создать, если я не определяю все абстрактные методы. Но часто при реализации шаблона Decorator я хочу определить только несколько абстрактных методов, а другие - просто делегировать декорированный объект. Как это сделать?Автоматическое делегирование для классов, расширяющих классы abc класса python
Например, я хочу сделать следующий код работы:
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