我有以下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
,但是可以使用属性实现我想要的行为吗?我觉得我必须重写我的逻辑才能使这项工作成功。
当你这样做:
myObject.velocity.x = 30
|_______________|
|
|___ this part already resolved the property
myObject.velocity
已经返回了Velocity
实例,这首先发生。接下来的.x
只是一个普通的属性访问,因为Vector
类没有定义处理x
的描述符。
我将建议一种不同的设计,使“速度”或“hi_res_velocity”仅为吸气剂,即其中一个在需要时从另一个计算。这将解决您的问题,并且还具有以下优点:您不必两次存储相同的状态。