Как обернуть конкретный подкласс в абстрактный/окончательный шаблон проектированияPython

Программы на Python
Ответить
Anonymous
 Как обернуть конкретный подкласс в абстрактный/окончательный шаблон проектирования

Сообщение Anonymous »

Я использую библиотеку Equinox для проекта, написанного на Python.
Эта библиотека используется для определения классов данных и настоятельно рекомендует использовать абстрактный/финальный шаблон при разработке этих классов.
Я понимаю большую часть этого, но есть часть, где я не уверен, что означает этот язык:

А что, если у вас есть существующий конкретный класс, который вы хотите настроить? совсем-чуть-чуть? В этом случае отдайте предпочтение композиции наследованию. Напишите оболочку, которая пересылает каждый метод соответствующим образом. Это столь же выразительно и означает, что мы сохраняем эти читаемые правила типобезопасности.

Итак, в качестве конкретного примера предположим, что у меня есть следующая структура классов:

Код: Выделить всё

from abc import abstractmethod
import jax.numpy as jnp
from jaxtyping import Float
import equinox as eqx

class AbstractShape(eqx.Module):

area: eqx.AbstractVar[Float]

@abstractmethod
def compute_area(self):
raise NotImplementedError

class Ellipse(AbstractShape):

area: Float
major_axis: Float
minor_axis: Float

def __init__(self, major_axis, minor_axis):
self.major_axis = major_axis
self.minor_axis = minor_axis
self.area = self.compute_area()

def compute_area(self):
return jnp.pi * self.major_axis * self.minor_axis

# How to define a circle class according to the abstract/final pattern?
...
Моя непосредственная идея — написать класс Circle как подкласс класса Ellipse. Но это запрещено рекомендуемым шаблоном; вы никогда не сможете создать подкласс конкретного класса в абстрактном/окончательном шаблоне проектирования.
Так что же значит [написать] написать оболочку, которая перенаправляет каждый метод соответствующим образом в этом контексте? Как мне прозрачно обернуть Ellipse, чтобы получить класс Circle (например, предоставив параметр радиуса)?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»