Python类私有属性如何编写getter、setter方法?@property不生效如何解决
运行环境
- 操作系统:Windows 10 64位
- 编辑器:VSCode 1.56.2
- Python版本:3.9.0
问题原因
你在构造方法__init__中直接对私有属性self.__year赋值,该操作不会触发@year.setter装饰的校验逻辑,传入的参数5直接被赋值给了__year,因此最终打印结果为5,不符合预期。
Python的@property装饰器绑定的校验规则仅在对实例的公开属性year赋值时生效,直接操作双下划线开头的私有属性会绕开所有校验逻辑。
修复方案
将__init__中的赋值逻辑修改为对公开属性year赋值,触发校验规则即可:
class Ab(): def __init__(self, year): self.year = year print(self.__year) @property def year(self): return self.__year @year.setter def year(self, y): if y < 8: self.__year = 0 else: self.__year = y a = Ab(5)
修改后运行代码输出为0,符合预期。
扩展说明
如果后续有多处需要对year赋值的场景,也可以将校验逻辑单独抽为私有方法,构造方法和setter统一调用该方法,避免逻辑重复,降低维护成本。
内容的提问来源于stack exchange,提问作者z.ghane
相关产品推荐
相关产品推荐

