设置嵌套属性时不执行Python setter

问题描述 投票:0回答:1

我有以下Python代码来表示对象的速度。

class Vector(object):
  def __init__(self, x, y):
    self.x, self.y = x, y

class Physics(object):
  def __init__(self, velocity):
    self.velocity = velocity

  @property
  def velocity(self):
    return self._velocity

  @velocity.setter
  def velocity(self, velocity):
    self._velocity = velocity
    self._hi_res_velocity = Vector(velocity.x * 1000, velocity.y * 1000)

我的意图是velocity.x设置_velocity.x_hi_res_velocity.x,但在这种情况下不会运行setter。我得到以下内容:

>>> myObject = Physics(Vector(10, 20))
>>> myObject.velocity.x = 30
>>> myObject._velocity.x, myObject._hi_res_velocity.x
(30, 10000)

我认为运行velocity的getter然后在返回值上设置x,但是可以使用属性实现我想要的行为吗?我觉得我必须重写我的逻辑才能使这项工作成功。

python python-decorators
1个回答
2
投票

当你这样做:

myObject.velocity.x = 30

|_______________|
        |
        |___ this part already resolved the property

myObject.velocity已经返回了Velocity实例,这首先发生。接下来的.x只是一个普通的属性访问,因为Vector类没有定义处理x的描述符。

我将建议一种不同的设计,使“速度”或“hi_res_velocity”仅为吸气剂,即其中一个在需要时从另一个计算。这将解决您的问题,并且还具有以下优点:您不必两次存储相同的状态。

© www.soinside.com 2019 - 2024. All rights reserved.