我正在尝试制作机器人套件。它设计得很简单,所以我使用属性,所以当用户更改参数时,属性方法发送控制电机/伺服/其他的串行命令。
这是目前的代码,直接来自我在此处提出的上一个问题。
class Servo(object):
def __init__(self, which_servo, angle = 0):
self._angle = angle;
self._servo_no = which_servo
def get_angle(self):
return self._angle
def set_angle(self, value):
self._angle = value
print "replace this print statement with the code to set servo, notice that this method knows the servo number AND the desired value"
def del_angle(self):
del self._angle
angle = property(get_angle, set_angle, del_angle, "I'm the 'angle' property.
然后将其初始化为:
class robot(object):
def __init___(self):
self.servos = [Servo(0), Servo(1), Servo(2), Servo(3)]
现在,这可以通过getter和setter函数改变变量,但是getter和setter中的打印件永远不会打印出来,因此如果我用串行命令替换它,我认为它不会做任何事情,任何人都可以对此有所了解吗?
由于
更新:感谢您使用伺服文件的帮助,这是发生了什么,有三个场景,第一个工作,并通过扩展,我会假设接下来的两个首选方案将工作,但他们没有任何想法?
import servo
class Robot(object):
def __init__(self):
self.servos = [servo.Servo(0, 0), servo.Servo(1,0), servo.Servo(2,0)]
R = Robot()
R.servos[1].angle = 25
import servo
class Robot(object):
def __init__(self):
self.servos = [servo.Servo(0, 0), servo.Servo(1,0), servo.Servo(2,0)]
R = Robot()
left_servo = R.servos[1].angle
left_servo = 25
import servo
class Robot(object):
def __init__(self):
self.servos = [servo.Servo(0, 0).angle, servo.Servo(1,0).angle, servo.Servo(2,0).angle]
R = Robot()
R.servo[1] = 25
答案 0 :(得分:0)
使用属性的首选装饰器语法,这很好。它还可以帮助您避免将来出现类似问题
class Servo(object):
def __init__(self, which_servo, angle = 0):
self._angle = angle;
self._servo_no = which_servo
@property
def angle(self):
return self._angle
@angle.setter
def angle(self, value):
self._angle = value
print "replace this print statement with the code to set servo"
@angle.deleter
def angle(self):
del self._angle
看到你的缩进不在这里,我相信这可能是你的缩进中的缩进问题。如果您真的想使用旧的property
函数,那么这也应该有效:
class Servo(object):
def __init__(self, which_servo, angle = 0):
self._angle = angle;
self._servo_no = which_servo
def get_angle(self):
return self._angle
def set_angle(self, value):
self._angle = value
print "replace this print statement with the code to set servo"
def del_angle(self):
del self._angle
angle = property(get_angle, set_angle, del_angle,"I'm the 'angle' property.")
这两个都成功地为我工作(在一个名为servo.py的文件中)
>>> import servo
>>> s = servo.Servo(1, 2)
>>> s.angle
2
>>> s.angle = 3
replace this print statement with the code to set servo
修改强>
解决您的新问题。当您将R.servos[1].angle
指定给left_servo
时,它不会创建对舵角的引用,只需将left_servo
设置为角度即可。当您将25重新分配给它时,您未分配给angle
分配给left_servo
。
在第二个问题上,我假设你的意思是R.servos
而不是R.servo
应该提出AttributeError
。但是我看到的真正问题是你应该说R.servos[1].angle = 25
并且你省略了.angle
。
要(尝试)简单地说:当您使用=
运算符时,您正在更改名称所指的 ,而不是 到。
>>> x = 1
>>> x = 2
第二个作业不会使用1
覆盖内存中的2
,只会更改x
所指的位置。所以,如果我做了像
>>> x = 1
>>> y = x
>>> y = 2
>>> print x
1
输出为1
,因为您告诉y
引用x
引用的相同位置。将y
更改为2
更改y
所指的位置,它不会更改已在内存中的1
。