2013-07-03 3 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)] 

Теперь, это работает в том отношении, что она делает изменить переменную через геттерных и инкубационные функций, однако отпечатки в геттер и сеттер никогда печатается, поэтому, если я заменю его последовательной командой, я предполагаю, что он тоже ничего не сделает, может ли кто-нибудь пролить свет на это?

Благодаря

Обновление: Спасибо за помощь, используя файл серво это случено, есть три сценария первых работ и расширением я предположил бы, что следующие два предпочтительных сценарии будут работать, но они это не делают есть идеи?

Это работает

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 частные классы? т.е.: существует класс (тип), определенный в другом классе, который не знает ни один внешний класс? Я предполагаю, что вы имеете в виду класс с частными переменными здесь? Примечание. Вы проверили, может ли ваша программа успешно выводить любую заявку на печать? (возможно, stdout получил перенаправление?) –

ответ

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 

EDIT

Для решения ваших новых проблем. Когда вы назначаете 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 уже в памяти.

+0

Нет, отступы - это просто не копировать в переполнение стека очень хорошо! – user2137452

+0

@ user2137452, вы пробовали использовать любой из них точно так же, как написано? они оба работают для меня, как ожидалось (см. править). –

+0

Кроме того, я также получаю сообщение об ошибке: robot() не имеет сервоприводов атрибутов при запуске этого кода «code' class robot (object): def __init ___ (self): self.servos = [Servo (0), Servo (1), Servo (2), Servo (3)] self.cheese = 1 г = робот() печати r.servos – user2137452

Смежные вопросы