Это точно работает:
from dataclasses import dataclass
@dataclass
class Test:
_name: str="schbell"
@property
def name(self) -> str:
return self._name
@name.setter
def name(self, v: str) -> None:
self._name = v
t = Test()
print(t.name) # schbell
t.name = "flirp"
print(t.name) # flirp
print(t) # Test(_name='flirp')
На самом деле, почему бы и нет? В конце концов, вы получите просто старый добрый класс, производный от типа:
print(type(t)) # <class '__main__.Test'>
print(type(Test)) # <class 'type'>
Может быть, поэтому свойства нигде конкретно не упоминаются. Тем не менее, Аннотация *1007* PEP-557 упоминает общее удобство использования известных функций класса Python:
Поскольку классы данных используют обычный синтаксис определения класса, вы свободны
использовать наследование, метаклассы, строки документации, определяемые пользователем методы,
фабрики классов и другие возможности класса Python.