0

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
...
4

0 に答える 0