Python 属性验证器和 __attrs_post_init__() 未被调用
Python attrs validator and __attrs_post_init__() are not called
我使用 @attr.s 创建了一个 class 并定义了一个属性验证器和 attrs_post_init() 方法。我希望在实例化此 class 的对象时自动调用这些方法。但是这些似乎根本不会在 init().
之前或之后的任何时候被调用
import attr
from typeguard import typechecked
from typing import Any, Optional
@attr.s(auto_attribs=True, init=False)
class Entry:
name: Optional[str] = attr.ib()
@typechecked
def __init__(
self, name: Optional[str] = None
):
print("Entered init")
self.name = name
@name.validator
def name_validator(self, _attribute: Any, value: Optional[str]) -> None:
print("Entered validator")
def __attrs_post_init__(self) -> None:
print("Entered post")
Entry("Bob")
这只会打印 Entered init
.
何时调用属性验证器和 attrs_post_init() 方法?
attrs
无法在对象构造时执行工作,除非您让它处理对象构造。您期望发生的事情通常会在生成的 __init__
方法中发生,但您将其关闭。
通过拒绝生成的 __init__
并实施您自己的,您 已经承担了这些任务的责任。如果您想要验证,您 需要这样做。如果你想__attrs_post_init__
被调用,你需要调用它。
我使用 @attr.s 创建了一个 class 并定义了一个属性验证器和 attrs_post_init() 方法。我希望在实例化此 class 的对象时自动调用这些方法。但是这些似乎根本不会在 init().
之前或之后的任何时候被调用import attr
from typeguard import typechecked
from typing import Any, Optional
@attr.s(auto_attribs=True, init=False)
class Entry:
name: Optional[str] = attr.ib()
@typechecked
def __init__(
self, name: Optional[str] = None
):
print("Entered init")
self.name = name
@name.validator
def name_validator(self, _attribute: Any, value: Optional[str]) -> None:
print("Entered validator")
def __attrs_post_init__(self) -> None:
print("Entered post")
Entry("Bob")
这只会打印 Entered init
.
何时调用属性验证器和 attrs_post_init() 方法?
attrs
无法在对象构造时执行工作,除非您让它处理对象构造。您期望发生的事情通常会在生成的 __init__
方法中发生,但您将其关闭。
通过拒绝生成的 __init__
并实施您自己的,您 已经承担了这些任务的责任。如果您想要验证,您 需要这样做。如果你想__attrs_post_init__
被调用,你需要调用它。