Python 属性:从 class 继承哪些值具有默认值会引发错误

Python attrs: Inheriting from class which values have default values raises error

我有这样一种情况,属性 class 继承自另一个 class 属性具有默认值。这会引发 ValueError。

这是一个例子:

from attrs import define


@define
class A:
    a: int = 1


@define
class B(A):
    b: int


test = B(b=1)

>>> ValueError: No mandatory attributes allowed after an attribute with a default value or factory.  Attribute in question: Attribute(name='b', ...

如何避免这种行为?

您 运行 达到了 Python 的限制。您要求 attrs 为您编写的 __init__ 看起来像这样:

def __init__(self, b=1, a):
    self.b = b
    self.a = a

不可能存在。

您可以通过声明 class B 或属性 b keyword-only:

来解决这个问题
from attrs import define, field


@define
class A:
    a: int = 1


@define(kw_only=True)
class B1(A):
    b: int

@define
class B2(A):
    b: int = field(kw_only=True)


test1 = B1(b=1)
test2 = B2(b=1)