Python 从属性内部打印

Python 从属性内部打印,python,properties,serial-port,robot,Python,Properties,Serial Port,Robot,我想做一个机器人工具包。它的设计很简单,所以我使用属性,所以当用户更改参数时,属性方法发送串行命令,控制电机/伺服/任何东西 这是目前的代码,直接来自我在这里提出的前一个问题 class Servo(object): def __init__(self, which_servo, angle = 0): self._angle = angle; self._servo_no = which_servo def get_angle(self): return self._

我想做一个机器人工具包。它的设计很简单,所以我使用属性,所以当用户更改参数时,属性方法发送串行命令,控制电机/伺服/任何东西

这是目前的代码,直接来自我在这里提出的前一个问题

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中的打印永远不会被打印,因此如果我用串行命令替换它,我认为它也不会做任何事情,有人能解释一下吗

谢谢

更新:感谢使用伺服文件的帮助,事情就是这样发生的,有三个场景第一个可以工作,扩展到下两个更好的场景可以工作,但他们没有任何想法

这很有效 这并不是: 这也不是
对属性使用首选的装饰器语法,效果很好。它还将帮助您避免将来出现类似的问题

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
鉴于您的缩进在这里是不正确的,我相信这可能是源代码中的缩进问题。如果您确实想使用旧的
属性
函数,这也应该可以:

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的文件中)

编辑

来解决你的新问题。当您将
R.servos[1].角度
指定给
left\u servo
时,它不会创建对伺服角度的引用,它只是将
left\u servo
设置为任何角度。当您将25重新分配给它时,您并没有分配给
角度
,而是分配给
左侧伺服

在第二个问题上,我假设你指的是
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

python是否有私有类?ie:在另一个类中定义的类(类型),外部类无法知道它是否存在?我猜你指的是一个有私有变量的类?注意:您是否检查过您的程序是否可以成功输出任何打印语句?(也许stdout被重定向了?)不,缩进是发现它只是没有很好地复制到堆栈溢出@user2137452,您是否尝试过完全按照编写的方式使用这两个选项中的任何一个?它们都按预期为我工作(请参见编辑)。此外,我现在在运行此代码时收到一个错误,即robot()没有属性servos
code
class robot(object):def _uinit___;(self):self.servos=[Servo(0),Servo(1),Servo(2),Servo(3)]self.cheese=1 r=robot()打印r。servos@user2137452请再次尝试使用我的第一个代码块,并告诉我它是否有效,因为它确实有效。@user2137452您需要发布更多的代码,可能发生了一些奇怪的事情。
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.")
>>> import servo
>>> s = servo.Servo(1, 2)
>>> s.angle
2
>>> s.angle = 3
replace this print statement with the code to set servo
>>> x = 1
>>> x = 2
>>> x = 1
>>> y = x
>>> y = 2
>>> print x
1