簡體   English   中英

將參數傳遞給凍結的超級數據類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM