2013-07-03 51 views
-1

我正在尝试制作机器人套件。它的设计很简单,所以我使用属性,所以当用户更改参数时,属性方法会发送控制电机/伺服/任何的串行命令。从属性内打印

这是目前的代码,直接来自我在此处询问的上一个问题。

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 
+1

python是否有私人类?即:在另一个类中定义的类(类型),不存在外部类可以知道的类?我猜你是指这里有私有变量的类吗?注意:您是否检查过您的程序是否可以成功输出任何打印语句? (也许标准输出重定向?) – 2013-07-03 16:05:49

回答

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 

第二次分配不与2覆盖在内存中1,它只是改变了其中x指。所以,如果我不喜欢的东西

>>> x = 1 
>>> y = x 
>>> y = 2 
>>> print x 
1 

输出为1,因为你是在告诉y指代x是指同一个地方。将y更改为2其中y所指的更改,它不会更改已在内存中的1

+0

一个不,缩进是找到它只是没有复制到堆栈溢出非常好! – user2137452

+0

@ user2137452,你有没有尝试过使用这些完全一样的书面?他们都按预期为我工作(见编辑)。 –

+0

此外,我现在得到一个错误,说机器人运行此代码时没有属性舵机 'code' class robot(object): def __init ___(self): self.servos = [Servo(0 ),伺服(1),伺服机构(2),伺服(3)] self.cheese = 1 R =机器人() 打印r.servos – user2137452