Python的@setter在类内部被调用时,接收的参数来自哪里?
Python @property setter 触发逻辑解释
你提供的代码如下:
class Circle: def __init__(self, radius): self.radius = radius @property def radius(self): return self.diameter / 2.0 @radius.setter def radius(self, radius): self.diameter = radius * 2.0 foo = Circle(5) print(foo.radius)
核心逻辑拆解
1. 先纠正对setter的认知误区
Python的@property是基于描述符协议实现的语法糖,不需要显式加括号调用setter。只要对被@property装饰的属性执行=赋值操作,就会自动触发对应的@xxx.setter方法,赋值号右边的值会自动作为参数传入setter方法。
你之前理解的self.radius(radius)、foo.radius(radius)是传统getter/setter方法的调用方式,不是@property装饰器的用法。
2. 代码执行的完整流程
整个代码的运行步骤如下:
- 执行
foo = Circle(5)时,首先调用类的__init__初始化方法,传入参数5 - 执行
__init__内的self.radius = radius这行赋值语句:因为radius已经被定义为property属性,这行不会直接给实例新增radius属性,而是自动触发@radius.setter装饰的setter方法,赋值号右边的5会作为参数传入setter的radius形参 - setter方法执行逻辑:
self.diameter = radius * 2.0,给实例新增diameter属性,赋值为5*2=10 - 执行
print(foo.radius)时,访问radius属性,自动触发@property装饰的getter方法,返回self.diameter / 2.0也就是10/2=5,控制台最终输出5
3. 补充说明
这个实现里,实例本身不会存储radius属性,实际存储的只有diameter属性,radius的取值完全是从diameter动态计算得到的,保证了两个属性的一致性:只要修改任意一个,另一个也会同步更新。
内容的提问来源于stack exchange,提问作者mdlphx92
相关产品推荐
相关产品推荐

