我有以下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
,但是是否可以使用属性实现我想要的行为?我觉得我必须重写我的逻辑才能完成这项工作。
答案 0 :(得分:2)
执行此操作时:
myObject.velocity.x = 30
|_______________|
|
|___ this part already resolved the property
myObject.velocity
已经返回Velocity
个实例,这首先发生了。然后,后面的.x
只是一个普通的属性访问,因为Vector
类没有定义处理x
的描述符。
我建议采用不同的设计,制作"速度"或者" hi_res_velocity"只有吸气剂,即每当需要时从另一个计算它们中的一个。这将解决您的问题,并且还具有不必两次存储相同状态的优势。