[英]Passing parameters to frozen super dataclass
我有一個簡單的(凍結的)數據類 inheritance 如下:
from attrs import frozen
@frozen
class Interval:
left: str
right: str
@frozen
class RealInterval(Interval):
def __attrs_pre_init__(self) -> None:
super().__init__("-oo", "+oo")
x = RealInterval()
根據文檔,它看起來很有希望:
attrs_pre_init會在 attrs 開始初始化之前自動檢測並運行。 如果您需要注入對 super() 的調用,這很有用。 初始化()
但是當我檢查mypy
時,我得到:
$ mypy example.py
example.py:13: error: Missing positional arguments "left", "right" in call to "RealInterval"
Found 1 error in 1 file (checked 1 source file)
請注意,這不是this的副本:
即使沒有attrs
模塊,這也應該可以工作
from dataclasses import dataclass
@dataclass(frozen=True)
class Interval:
left: str
right: str
@dataclass(frozen=True)
class RealInterval(Interval):
def __init__(self) -> None:
super().__init__("-oo", "+oo")
x = RealInterval()
子類的__init__
在超類的__init__
之前運行。
這可以通過attrs
來完成,將@dataclass(frozen=True)
替換為@frozen
。
請注意,這會覆蓋子類的默認__init__
方法。
這不是attrs
的方式(就此而言:數據類的工作方式)。
__init__
是專門為您出於性能原因定義的屬性而編寫的。
對於您的用例,最簡單的解決方案是覆蓋屬性:
@frozen
class RealInterval(Interval):
left: str = "-oo"
right: str = "+oo"
這給了你:
>>> RealInterval()
RealInterval(left='-oo', right='+oo')
>>> RealInterval("foo", "bar")
RealInterval(left='foo', right='bar')
pre_init 邏輯是當你繼承你不擁有的類時,但需要調用它們的__init__
。 例如,某些 GUI 工具包就是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.