从属性内打印

2024-06-12 21:19:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个机器人工具箱。它的设计很简单,所以我使用属性,所以当用户改变一个参数时,属性方法会发送串行命令来控制马达/伺服/任何东西。你知道吗

这是目前的代码,直接来自我在这里问的前一个问题。你知道吗

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

Tags: theimportselfobjectinitvaluedefrobot
1条回答
网友
1楼 · 发布于 2024-06-12 21:19:00

对属性使用首选的decorator语法,这样做很好。它也能帮助你避免将来出现这样的问题

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.")

这两个都成功地为我工作(在一个名为伺服.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重新分配给它时,您没有将25分配给angle,而是将25分配给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。你知道吗

相关问题 更多 >