FooBC
データクラスの抽象基底クラスを実装するために必要なボイラー プレート コードを削減したいと考えています。ABC が行う必要があること:
- すべての継承者は、(たとえば) float とは少し異なる方法で作成されます。そのため、それぞれが
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'
)
float_value/2
が呼び出されるたびに自動的に保存されるように FooBC クラスをアップグレードするにはどうすればよい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
...