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

关于Python中@property的getter与setter工作逻辑的疑问

Python @property 属性的运行逻辑解惑

我是Python属性的新手,对以下代码的运行逻辑感到困惑:

class FavoriteShape:
    def __init__(self, color, shape):
        self.color = color
        self.shape = shape

    @property
    def shape(self):
        print('getter method for shape')
        return self.something_else

    @shape.setter
    def shape(self, x):
        print('setter method for shape')
        self.something_else = x

obj1 = FavoriteShape('blue','square')
print('color = ' + obj1.color)
print('shape = ' + obj1.shape)

我理解在__init__函数中,对self.shape的赋值会调用对应的setter方法,但setter方法是将参数x赋值给something_else变量,想请教self.shape是如何获取到something_else的值的?我已尝试搜索相关问题并调试代码,期待得到解答,非常感谢!

核心逻辑拆解

  • 当你对self.shape赋值时(比如__init__里的self.shape = shape),Python会自动调用被@shape.setter装饰的setter方法:它把传入的square存到实例的something_else属性里,这部分你已经理解。
  • 当你读取obj1.shape时(比如print('shape = ' + obj1.shape)),Python会自动调用被@property装饰的getter方法:这个方法的唯一作用就是返回self.something_else的值——也就是之前setter存进去的square。

本质说明

@property的核心作用是把一个方法“伪装”成实例属性:

  • 读取这个“属性”时,实际执行的是getter方法的逻辑;
  • 给这个“属性”赋值时,实际执行的是setter方法的逻辑。

这里的something_else是实例的内部存储属性(通常这类内部属性会加下划线前缀,比如_shape,用来标识是仅供类内部使用的),setter负责写入,getter负责读取,两者配合就实现了对shape这个对外暴露的“伪属性”的读写控制。

代码运行输出验证

运行这段代码会得到以下输出,对应每一步的方法调用:

setter method for shape
color = blue
getter method for shape
shape = square

内容的提问来源于stack exchange,提问作者a.J.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:44:58