【发布时间】:2020-11-04 14:01:42
【问题描述】:
我想让字符串比较不区分大小写。 为此,我想创建一个只有一个字符串字段的不可变类。 在构造函数中,我想在将值分配给字段之前调用 lower()。
我想尽可能多地使用标准类,如namedtuple 或dataclass。 使用 post_init 函数(例如,参见 How to use the __post_init__ method in Dataclasses in Python)感觉就像是 hack。 这也让我想知道我在 post_init 函数中更改字段后是否仍然冻结。
但是,我找不到 pre_init 函数。 有没有更好的办法?
【问题讨论】:
-
"我想在将值分配给字段之前调用 lower()" -- 那么,有什么阻止你这样做吗?如果是这样,请详细说明。如果不是,还有什么问题?
-
为什么你的常规初始化中的 .lower() 不够?只是这里的业余爱好者,所以也许我缺乏一些 SE 知识...
-
A
pre_init- 在__init__之前调用的方法是__new__。在这里查看更多spyhce.com/blog/understanding-new-and-init -
new是类的初始化,init是实例的初始化。所有实例都应转换为较低的。
-
例如,将 NamedTuple 的 init 覆盖为 ```` class Name(NamedTuple): name: str def init__(self, name: str) - > None: def canonical_representation() -> str: return name.lower() self.name: str = canonical_representation() ``` 不允许:``` File "C:\Users\laarpjljvd\AppData\Local\Programs \Python\Python39\lib\typing.py",第 1775 行,在 __new 中引发 AttributeError("Cannot overwrite NamedTuple attribute " + key) ``
标签: python