В следующем коде значения по умолчанию в определении класса Container должны создавать новые переменные экземпляра для c1.a и c2.a.
Вместо этого похоже, что c1.a и c2.a ссылаются на одну и ту же переменную.
Создает ли @dataclass переменная класса? Кажется, это не соответствует предполагаемой функциональности, и я не могу найти ничего о переменных класса в документации.
Поэтому я думаю, что это ошибка. Может кто-нибудь объяснить мне, как это исправить? Должен ли я сообщить об этом как об ошибке в трекере Python?
Я знаю, что эта проблема должна быть связана с тем, как Python передает объекты по ссылке и встроенные типы по значению, поскольку b (это просто число с плавающей запятой) показывает ожидаемое/желаемое поведение, тогда как атрибут a (который является определяемым пользователем объектом) является просто ссылка.
Спасибо!
Код:
from dataclasses import dataclass
@dataclass
class VS:
v: float # value
s: float # scale factor
def scaled_value(self):
return self.v*self.s
@dataclass
class Container:
a: VS = VS(1, 1)
b: float = 1
c1 = Container()
c2 = Container()
print(c1)
print(c2)
c1.a.v = -999
c1.b = -999
print(c1)
print(c2)
Выходы:
Container(a=VS(v=1, s=1), b=1)
Container(a=VS(v=1, s=1), b=1)
Container(a=VS(v=-999, s=1), b=-999)
Container(a=VS(v=-999, s=1), b=1)
Подробнее здесь: https://stackoverflow.com/questions/628 ... e-variable
Ссылка Python dataclasses.dataclass на переменную вместо переменной экземпляра ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как получить хорошие типы из `dataclass` Python без создания экземпляра класса
Anonymous » » в форуме Python - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-