1. ホーム
  2. python

[解決済み] 'instancemethod' オブジェクトは、クラス変数で '__getitem__' という属性を持たない

2022-02-20 13:05:39

質問

Raspberry Piを使ってステッピングモータを制御するpythonクラスを作ろうとしています。ほとんど動作するのですが、「'instancemethod' object has no attribute」というエラーメッセージが表示されます。 '__getitem__' をクラス変数として定義すると、必ずエラーが発生します。エラーメッセージには、このコードの一部が原因として挙げられていますが、私はそれが間違っていることを見ることができません if seq[self.StepCounter][pin]!=0:. インスタンス変数やグローバル変数として定義するとうまくいくのですが。 これは私のコードです。 インポート RPi.GPIO as GPIO インポート時間 デバッグ = True

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)

どなたか、どこが悪いのか、その理由を教えていただけませんか。ありがとうございます。

解決方法を教えてください。

完全なトレースバックが掲載されていませんが、推測は可能です。

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 -メソッドの第 1 要素?

何もない、なぜなら。

'instancemethod' object has no attribute '__getitem__'

を使うべきではありません。 clockwise 最後に実行された定義のみが保持されるため、リスト名とメソッド名の両方として seq = stepper.clockwise リストではなく、メソッドです。