You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在调用__init__时触发Python属性的Setter方法?

问题解决:让Property的Setter在校验初始化值时生效

问题核心原因很明确:你在__init__方法里直接给私有属性self._name赋值,完全绕开了name这个property的setter方法(SetName),所以传入非字符串值时不会触发校验报错。

解决方案1:在__init__中调用Property的Setter(推荐)

直接把self._name = name替换为self.name = name,这样初始化时就会通过property的setter逻辑,触发SetName里的校验:

def __init__(self, name:str, price:int, note = None) -> None:
    self.name = name  # 调用property的setter,触发类型校验
    self._price = price
    self.note = note
    Product.listOfProducts.append(self)

这样修改后,当你传入非字符串(比如5)时,就会触发ValueError,符合预期。

解决方案2:抽离校验逻辑,统一调用

如果希望保持直接操作私有属性的写法,可以把校验逻辑单独抽成一个函数,让__init__和SetName都调用它,避免代码重复:

def _validate_name(self, name):
    if not isinstance(name, str):
        raise ValueError("It must be a string")

def SetName(self, name):
    self._validate_name(name)
    self._name = name

def __init__(self, name:str, price:int, note = None) -> None:
    self._validate_name(name)  # 手动调用校验逻辑
    self._name = name
    self._price = price
    self.note = note
    Product.listOfProducts.append(self)

补充说明

注意:函数参数里的name:str只是类型注解,仅作为代码提示使用,Python不会自动根据注解做类型检查,必须依靠你编写的校验逻辑来保证值的合法性。

内容的提问来源于stack exchange,提问作者CitrusBoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:15:38