在 Python 数据 类 中混合实例属性和字段
Mixing instance attributes and fields in Python data classes
我想“混合搭配”实例属性和数据类字段,有效地将数据类扩展为具有可计算值的可选属性。我尝试通过使用默认数据类(因此没有显式初始化方法)来做到这一点,但在 __post_init__
中实例化实例属性(不是字段)。不过,这似乎让我的 IDE 不满意,因为它警告我这些属性是“在 init 方法之外定义的”。
导入数据类
从键入 import Optional, List
@dataclasses.dataclass
class Word:
text: str
def __post_init__(self):
self.chars: List[str] = self.text.split()
self.alt_text: Optional[str] = None
self.alt_text_chars: Optional[List[str]] = None
def add_alt_text(self, text: str):
self.alt_text = text # IDE complains that instance attribute is defined outside init
self.alt_text_chars = text.split() # IDE complains
word = Word("hello")
word.add_alt_text("good morning")
这是否意味着我想要实现的目标是不可能的,即将实例属性与常规数据类字段混合?或者是否有一种 (PEP-y) 方法可以解决这个问题?
附带说明:有时您明确希望属性不被视为与字段相同。例如,当您的数据类具有 __eq__
(默认值)时,您可能只想比较字段而不是其属性的 all。
您可以通过使用 field()
将字段列在数据类中并将 init=False
和 compare=False
传递给 field
调用来管理字段,尽管我不确定这是不是你在找什么。
我想“混合搭配”实例属性和数据类字段,有效地将数据类扩展为具有可计算值的可选属性。我尝试通过使用默认数据类(因此没有显式初始化方法)来做到这一点,但在 __post_init__
中实例化实例属性(不是字段)。不过,这似乎让我的 IDE 不满意,因为它警告我这些属性是“在 init 方法之外定义的”。
导入数据类 从键入 import Optional, List
@dataclasses.dataclass
class Word:
text: str
def __post_init__(self):
self.chars: List[str] = self.text.split()
self.alt_text: Optional[str] = None
self.alt_text_chars: Optional[List[str]] = None
def add_alt_text(self, text: str):
self.alt_text = text # IDE complains that instance attribute is defined outside init
self.alt_text_chars = text.split() # IDE complains
word = Word("hello")
word.add_alt_text("good morning")
这是否意味着我想要实现的目标是不可能的,即将实例属性与常规数据类字段混合?或者是否有一种 (PEP-y) 方法可以解决这个问题?
附带说明:有时您明确希望属性不被视为与字段相同。例如,当您的数据类具有 __eq__
(默认值)时,您可能只想比较字段而不是其属性的 all。
您可以通过使用 field()
将字段列在数据类中并将 init=False
和 compare=False
传递给 field
调用来管理字段,尽管我不确定这是不是你在找什么。