【发布时间】:2023-03-22 07:59:01
【问题描述】:
我对 Python 并不完全陌生,但有时我仍然对 Python 的逻辑或思考的解释方式有疑问。我在文件 testclass.py 中有一个名为 TestClass 的类,它有一个属性 x 和相应的 get 和 set 方法。
class TestClass(object):
@property
def x(self):
print('get x')
return self.__x
@x.setter
def x(self, x):
print('set x')
self.__x = x
如果我运行一个简单的示例,一切都会正常运行。因此调用 get 和 set 方法并打印它们的确认消息:
>>> from testclass import TestClass
>>> newObject = TestClass()
>>> newObject
<testclass.TestClass object at 0x0298B9D0>
>>> newObject.x = [1, 2, 3, 4]
set x
>>> newObject.x
get x
[1, 2, 3, 4]
我的问题是,如果我只是想通过索引来修改属性,则调用 get 方法(我期望的)从对象中获取属性,但是绕过了 set 方法(没有打印 set 消息,但属性被修改):
>>> newObject.x[1] = 99
get x
>>> newObject.x
get x
[1, 99, 3, 4]
对我来说,这种行为不太合乎逻辑。我来自 Matlab(这不是 OOP 最优雅的语言)。 Matlab中相同的结构会导致以下过程:
- 调用 x 的 get 方法来获取 x
- 用新值替换特定索引处的值
- 调用set方法用新的x覆盖旧版本的x
这只是一个小例子。在我的代码中,每次修改属性时,我都需要进入 set 方法。有没有一种pythonic方式?
非常感谢!
【问题讨论】:
-
在Matlab terms中,所有Python变量都是句柄变量,所有Python对象都是句柄对象。
标签: python get set python-decorators