Эта библиотека используется для определения классов данных и настоятельно рекомендует использовать абстрактный/финальный шаблон при разработке этих классов.
Я понимаю большую часть этого, но есть часть, где я не уверен, что означает этот язык:
А что, если у вас есть существующий конкретный класс, который вы хотите настроить? совсем-чуть-чуть? В этом случае отдайте предпочтение композиции наследованию. Напишите оболочку, которая пересылает каждый метод соответствующим образом. Это столь же выразительно и означает, что мы сохраняем эти читаемые правила типобезопасности.
Итак, в качестве конкретного примера предположим, что у меня есть следующая структура классов:
Код: Выделить всё
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?
...
Так что же значит [написать] написать оболочку, которая перенаправляет каждый метод соответствующим образом в этом контексте? Как мне прозрачно обернуть Ellipse, чтобы получить класс Circle (например, предоставив параметр радиуса)?
Мобильная версия