【发布时间】:2021-04-10 03:36:54
【问题描述】:
考虑以下示例代码
from dataclasses import dataclass, field
from typing import ClassVar
@dataclass
class Base:
x: str = field(default='x', init=False)
@dataclass
class A(Base):
name: str
@dataclass
class B(Base):
name: str
a = A('test_a')
b = B('test_b')
a.x = 'y'
a.x # prints 'y'
b.x # prints 'x'
按预期打印“y”和“x”。
现在我想让x 成为dict 类型的ClassVar:
from dataclasses import dataclass, field
from typing import ClassVar, Dict
@dataclass
class Base:
x: ClassVar[Dict[str, str]] = field(default={'x': 'x'}, init=False)
@dataclass
class A(Base):
name: str
@dataclass
class B(Base):
name: str
a = A('test_a')
b = B('test_b')
a.x['y'] = 'y'
a.x
b.x
但是,现在的输出是
a.x => {'x': 'x', 'y': 'y'}
b.x => {'x': 'x', 'y': 'y'}
我希望只有 a.x 被修改,b.x 保持默认初始值 `{'x': 'x'}。
如果该字段不是ClassVar,那么我可以使用default_factory=dict,但这不能与ClassVar结合使用,因为它会返回错误
Field cannot have a default factory
【问题讨论】:
-
default={'x': 'x'}表示所有使用默认值的实例共享对同一个字典的引用。如果你不能使用default_factory,这似乎是不可避免的。 -
@jonrsharpe 更新我使用
default_factory得到的错误,它似乎不兼容
标签: python inheritance class-variables python-dataclasses