如何在调用__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
相关产品推荐
相关产品推荐

