0

我想减少实现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
...
4

0 回答 0