Я создал класс, используя @attr.s, и определил валидатор атрибутов и метод attrs_post_init(). Я ожидаю, что эти методы будут автоматически вызываться при создании экземпляра объекта этого класса. Но они, похоже, вообще не вызываются ни до, ни после 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__
звонили, вам нужно звонить.