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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:54:06