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

时间:2018-03-02 06:15:42

标签: python python-decorators

我有以下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,但是是否可以使用属性实现我想要的行为?我觉得我必须重写我的逻辑才能完成这项工作。

1 个答案:

答案 0 :(得分:2)

执行此操作时:

myObject.velocity.x = 30

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

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

我建议采用不同的设计,制作"速度"或者" hi_res_velocity"只有吸气剂,即每当需要时从另一个计算它们中的一个。这将解决您的问题,并且还具有不必两次存储相同状态的优势。