Учитывая следующую модель данных
from typing import List
class A:
a: List[int] = []
class B(A):
def __init__(self, b: str, a: List[int] = []):
self.b = b
self.a = a
Факты
- Это Евангелие, которое
A
не может бытьdataclass
(это сделало бы проблему тривиальной) - Мы хотим наследовать
A
черезB
- Мы не хотим иметь возможность устанавливать параметр
a
при создании экземпляраA
- Мы хотим иметь возможность устанавливать параметр
a
при создании экземпляраB
Следующее, что я предположил, будет работать, было
from typing import List
from dataclasses import dataclass, field
class A:
a: List[int] = []
@dataclass
class B(A):
b: str
a: List[int]
Исправление ошибки ValueError: mutable default <class 'list'> for field babies is not allowed: use default_factory
Получаю
from typing import List
from dataclasses import dataclass, field
class A:
a: List[int] = field(default_factory=list)
@dataclass
class B(A):
b: str
a: List[int]
но это приводит к следующей ошибке AttributeError: a
Если вместо этого я использую целочисленный тип для a
, сработает следующее, показывая, что теоретически то, что я делаю, нормально, но я выражаю это неправильно:
from typing import List
from dataclasses import dataclass, field
class A:
a: int = 1
@dataclass
class B(A):
b: str
a: int
Что я здесь делаю не так? Как мне заставить это работать с a
как пустым списком в B