【问题标题】:'instancemethod' object has no attribute '__getitem__' with class variables“instancemethod”对象没有带有类变量的属性“__getitem__”
【发布时间】:2014-02-17 09:16:05
【问题描述】:

我正在尝试创建一个 python 类来使用我的 Raspberry Pi 控制步进电机。它大部分都有效,但是每当我将列表定义为类变量时,我都会不断收到“'instancemethod'对象没有属性'__getitem__'错误。错误消息将这段代码列为罪魁祸首,但我什么也看不到如果 seq[self.StepCounter][pin]!=0: 则错误。但如果我将其定义为实例变量或全局变量,它将起作用。 这是我的代码: 导入 RPi.GPIO 作为 GPIO 进口时间 调试 = 真

class stepper:
    clockwise = []
    clockwise = range(0,4)
    clockwise[0] = [1,0,0,0]
    clockwise[1] = [0,1,0,0]
    clockwise[2] = [0,0,1,0]
    clockwise[3] = [0,0,0,1]
    def __init__(self,pin1,pin2,pin3,pin4):
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        self.pin1 = pin1
        self.pin2 = pin2
        self.pin3 = pin3
        self.pin4 = pin4
        self.StepCounter = 0
        self.pinarray = [pin1,pin2,pin3,pin4]
        for pin in self.pinarray:
            if debug == True:
                print "Setup pin " + str(pin)
            GPIO.setup(pin,GPIO.OUT)
            GPIO.output(pin, False)
        self.stepNum = 512.0
        self.coilNum = 4.0

    def setup(self,stepNum,coilNum):
        self.stepNum = float(stepNum)
        self.coilNum = float(coilNum)
        self.partNum = self.coilNum * self.stepNum

    def clockwise(self,speed):
        seq = stepper.clockwise
        self.WaitTime = (1.0 / (self.stepNum * self.coilNum)) * speed
        for pin in range(0, 4):
            xpin = self.pinarray[pin]
            if seq[self.StepCounter][pin]!=0:
              GPIO.output(xpin, True)
            else:
              GPIO.output(xpin, False)
        self.StepCounter += 1
        if (self.StepCounter==len(seq)):
            self.StepCounter = 0
        if (self.StepCounter<0):
            self.StepCounter = len(seq)
        time.sleep(self.WaitTime)

print "Adding Motor Instance"    
motor = stepper(24,25,8,7)
print "Spinning Motor"
while "True":
    motor.clockwise(5)

请有人告诉我它有什么问题并解释原因。谢谢

【问题讨论】:

  • 不是说这会解决它,但为什么顺时针启动如此奇怪?只需在一个声明中执行:-P
  • 你能给出确切的完整错误吗?
  • 请顺时针初始化为:clockwise = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],而不是你的烂摊子! ;-)
  • 你有两个属性叫做clockwise,一个列表和一个方法。

标签: python raspberry-pi


【解决方案1】:

您没有发布完整的回溯,但我可以猜测一下:

def clockwise(self,speed):
    seq = stepper.clockwise
    self.WaitTime = (1.0 / (self.stepNum * self.coilNum)) * speed
    for pin in range(0, 4):
        xpin = self.pinarray[pin]
        if seq[self.StepCounter][pin]!=0:

您在第一行设置seq 等于方法stepper.clockwise。然后几行之后,您尝试对其进行索引:seq[self.StepCounter]。但是获取方法的self.StepCounter-th 元素是什么意思呢?

没什么,因为:

'instancemethod' object has no attribute '__getitem__'

您不应该同时使用clockwise 作为列表的名称和方法的名称;只有最后执行的定义才会成立,所以当你到达 seq = stepper.clockwise 时,它是方法,而不是列表。

【讨论】:

  • 另外,clockwise = range(0,4) 使clockwise=[] 变得不必要;在为其分配列表之前,您无需顺时针“声明”。一个clockwise = [ [1,0,0,0], [0,1,0,0], [0,0,1,0], [0,0,0,1] ] 就足够了。
猜你喜欢
  • 2013-03-17
  • 2017-02-27
  • 2017-01-16
  • 2014-08-10
  • 1970-01-01
  • 2018-05-09
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多