Рассмотрим следующий класс данных. Я хотел бы предотвратить создание объектов с использованием метода __init__
direclty.
from __future__ import annotations
from dataclasses import dataclass, field
@dataclass
class C:
a: int
@classmethod
def create_from_f1(cls, a: int) -> C:
# do something
return cls(a)
@classmethod
def create_from_f2(cls, a: int, b: int) -> C:
# do something
return cls(a+b)
# more constructors follow
c0 = C.create_from_f1(1) # ok
c1 = C() # should raise an exception
c2 = C(1) # should raise an exception
Например, я хотел бы принудительно использовать дополнительные конструкторы, которые я определяю, и вызвать исключение или предупреждение, если объект непосредственно создается как c = C(..)
.
То, что я до сих пор пробовал, таково:
@dataclass
class C:
a : int = field(init=False)
@classmethod
def create_from(cls, a: int) -> C:
# do something
c = cls()
c.a = a
return c
с init=False
в field
Я запрещаю a
быть параметром для сгенерированного __init__
, поэтому это частично решает проблему, так как c = C(1)
вызывает исключение.
Кроме того, мне не нравится это решение.
Есть ли прямой способ отключить вызов метода init извне класса?