关于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.
相关产品推荐
相关产品推荐

