使用__call __,__ setitem__或自定义函数来设置关节类实例的角度

时间:2016-01-21 16:27:29

标签: python python-2.7

假设我有一个Joint类来控制机器人腿部的伺服角度(例如joint类的实例是kneehip ,或ankle)。最好的办法是什么?这是我的选择,假设我想将关节的角度设置为90度

  1. 定义set()函数,以便我可以执行hip.set(90)
  2. 覆盖__call___功能,以便我可以hip(90)
  3. 覆盖__setitem__功能,以便我可以hip = 90
  4. 我应该使用什么?为什么这是最好的?

    编辑:

    现在我的班级看起来像这样:

    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 
    

1 个答案:

答案 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函数)