Почему моя программа выдает ошибку атрибута python? - PullRequest
1 голос
/ 14 октября 2019

Новичок Python здесь пытается написать алгоритм поиска A * для алгоритма поиска блина. Однако мой конструктор выбрасывает объект 'Pancakes', не имеющий атрибута 'numPancakes' в некоторых функциях, но не в других, которые его также используют. Что не так? Приведенная ниже функция печати не создает проблем.

class Pancakes:
    def __init__(self, stack, backwardCost): 
        print("Constructor called")
        self.backwardCost = backwardCost
        self.forwardCost = self.calculateForwardCost()
        self.numPancakes = len(stack) - 1
        self.pancakeStack = stack
        self.total =  self.calculateForwardCost() + self.backwardCost



def print(self):
    stackState = "Stack: "
    for i in range((self.numPancakes)):
        stackState += str(self.pancakeStack[i]) + " "
    print(stackState)

Как только я пытаюсь использовать

def calculateForwardCost(self):
    forwardCost = 0
    for i in range(self.numPancakes):
        gap = self.pancakeStack[index] - self.pancakeStack[index + 1]
        if gap < -1 or gap > 1:
            forwardCost += 1
    return forwardCost

, программа говорит:

File "aStar.py", line 8, in __init__
    self.forwardCost = self.calculateForwardCost()
  File "aStar.py", line 22, in calculateForwardCost
    for i in range(self.numPancakes):
AttributeError: 'Pancakes' object has no attribute 'numPancakes'

1 Ответ

2 голосов
/ 14 октября 2019

Посмотрите на порядок, в котором у вас есть вещи в конструкторе:

self.forwardCost = self.calculateForwardCost()  # Requires self.numPancakes

self.numPancakes = len(stack) - 1  # But self.numPancakes isn't set until here

Вы пытаетесь использовать self.numPancakes до его назначения. Просто поменяйте местами эти строки, чтобы убедиться, что numPancakes установлено первым:

self.numPancakes = len(stack) - 1

self.forwardCost = self.calculateForwardCost()

На самом деле, я снова читаю ваш код, и pancakeStack также используется до его назначения. Каждый атрибут, необходимый внутри calculateForwardCost, должен быть назначен до вызова этой функции.

...