我想减少实现FooBC
数据类的抽象基类所需的样板代码。ABC需要做什么:
- 每个继承者的创建都与(例如)浮点数略有不同,这就是为什么每个继承者都需要实现
from_float()
类方法的原因。 - 但所有继承人都应该保存
float_value / 2
. 我怎样才能自动化呢?目前,用户被迫float_value / 2
在每个实现中粘贴from_float()
.
现在,这是我的代码:
# Abstract Base Class
@dataclass
class FooBC(ABC):
always_save_half: float
@classmethod
@abstractmethod
def from_float(cls, value: float):
pass
def __post_init__(self):
"""Allows inheritance by 'dataclasses'"""
# just intercept the __post_init__ calls so they
# aren't relayed to `object`
# Inheritor
@dataclass
class FooInheritor(FooBC):
special_foo_result: float
def from_float(cls, value: float):
return cls(
special_foo_result: value * 10, # intended, unique use of 'from_foodata'
##### IDENTICAL FOR ALL INHERITORS; HOW CAN I GET RID OF THIS: #####
always_save_half: value / 2,
)
我很想将 Inheritor 样板减少到:
# Inheritor
@dataclass
class FooInheritor(FooBC):
special_foo_result: float
def from_float(cls, value: float):
return cls(
special_foo_result: value * 10, # intended, unique use of 'from_float'
)
如何升级 FooBC 类以在调用float_value/2
时自动保存from_float
?
我想这样的事情会很棒:
# Abstract Base Class
@dataclass
class FooBC(ABC):
_always_save_half: float = field(init=False, repr=False)
@classmethod
@abstractmethod
def from_float(cls, value: float):
pass
@use_input.from_float # my fantasy decorator, using from_float()'s input
def _init_after_from_float(value: float):
self._always_save_half = value / 2
@property
def always_save_half() -> float:
return self._always_save_half
...