【问题标题】:Printing from within properties从属性内部打印
【发布时间】:2013-07-01 10:10:07
【问题描述】:

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

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

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

【问题讨论】:

  • python有私有类吗?即:在另一个类中定义的类(类型)没有外部类可以知道存在?我猜你的意思是一个带有私有变量的类?注意:您是否检查过您的程序是否可以成功输出任何打印语句? (也许标准输出被重定向了?)

标签: python properties serial-port robot


【解决方案1】:

使用属性的首选装饰器语法,这工作正常。它还可以帮助您避免将来出现此类问题

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

要(尝试)简单地说:当您使用= 运算符时,您正在更改名称所指的where,而不是它所指的what

>>> x = 1
>>> x = 2

第二个赋值不会用2 覆盖内存中的1,它只是改变x 所指的位置。所以如果我做了类似的事情

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

输出是1,因为您告诉y 指的是x 指的同一个地方。将y 更改为2 会更改y 所指的位置,但不会更改内存中已经存在的1

【讨论】:

  • 不,缩进发现它只是没有很好地复制到堆栈溢出!
  • @user2137452,您是否尝试过完全按照书面方式使用其中任何一个?他们都按预期为我工作(见编辑)。
  • 另外,我现在收到一个错误,说机器人()在运行此代码时没有属性伺服器code class robot(object): def __init___(self): self.servos = [ Servo(0), Servo(1), Servo(2), Servo(3)] self.cheese = 1 r = robot() print r.servos
  • @user2137452 再次尝试使用我的第一个代码块,并告诉它是否有效,因为它确实有效。
  • @user2137452 你需要发布更多代码,可能会发生一些奇怪的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
相关资源
最近更新 更多