假设我有一个Joint
类来控制机器人腿部的伺服角度(例如joint
类的实例是knee
,hip
,或ankle
)。最好的办法是什么?这是我的选择,假设我想将关节的角度设置为90度
set()
函数,以便我可以执行hip.set(90)
__call___
功能,以便我可以hip(90)
__setitem__
功能,以便我可以hip = 90
我应该使用什么?为什么这是最好的?
编辑:
现在我的班级看起来像这样:
class Joint:
def __init__(self, joint_type, jkey, min_angle = -90, max_angle = 90):
self.joint_type, self.name = joint_type, jkey
self.channel, self.min_pulse, self.max_pulse = joint_properties[jkey]
self.min_angle, self.max_angle = min_angle, max_angle
self.off()
def set(self, angle):
angle = constrain(angle, self.min_angle, self.max_angle)
pulse = remap(angle, self.min_angle, self.max_angle, self.min_pulse, self.max_pulse)
drive(self.channel, pulse)
self.current_angle = angle
def off(self):
drive(self.channel, 0)
self.current_angle = None
答案 0 :(得分:3)
restfulgit
但是,如果您对该归因(您可能已经拥有)进行验证,检查和副作用,则可以为hip.angle = 90
属性设置property
...
hip
这种定义getter和setter的方法是Python的一个非常好的功能:无论谁使用你的类的实例,所需要的只是归属。在引擎盖下,调用getter和setter方法。
class Joint(object):
...
@property
def hip(self):
return self._hip
@hip.setter
def hip(self, value):
validate(value)
send_to_external_device(value)
self._hip = value
是一个特殊的内置装饰器 - 在早期版本中,它只构建了属性对象,并且必须通过普通函数调用getter和可选的setter和deleter函数。新的装饰器语法更短,但看起来有点神奇 - 另一种方式更容易理解新手的情况:
property
(这个工作方式相同,但它也暴露了类名称空间中的getter和setter函数)