Начинающий Python: AttributeError: объект "list" не имеет атрибута

ошибка говорит:

AttributeError: 'list' object has no attribute 'cost' 

Я пытаюсь получить простой расчет прибыли для работы, используя следующий класс для обработки словаря велосипедов:

class Bike(object):
    def __init__(self, name, weight, cost):
        self.name = name
        self.weight = weight
        self.cost = cost

bikes = {
    # Bike designed for children"
    "Trike": ["Trike", 20, 100],
    # Bike designed for everyone"
    "Kruzer": ["Kruzer", 50, 165]
    }

когда я пытаюсь рассчитать прибыль с помощью моего оператора for, я получаю ошибку атрибута.

# Markup of 20% on all sales
margin = .2
# Revenue minus cost after sale
for bike in bikes.values():
    profit = bike.cost * margin

во-первых, я не знаю, почему он ссылается на список, и вроде бы все определено, нет?

3 ответов


считаем:

class Bike(object):
    def __init__(self, name, weight, cost):
        self.name = name
        self.weight = weight
        self.cost = cost

bikes = {
    # Bike designed for children"
    "Trike": Bike("Trike", 20, 100),      # <--
    # Bike designed for everyone"
    "Kruzer": Bike("Kruzer", 50, 165),    # <--
    }

# Markup of 20% on all sales
margin = .2
# Revenue minus cost after sale
for bike in bikes.values():
    profit = bike.cost * margin
    print(profit)

выход:

33.0
20.0

разница в том, что в bikes словарь, вы инициализируете значения как списки [...]. Вместо этого, похоже, что остальная часть вашего кода хочет Bike экземпляров. Так создайте Bike случаях: Bike(...).

что касается вашей ошибки

AttributeError: 'list' object has no attribute 'cost'

это произойдет, когда вы попытаетесь вызвать .cost на


вам нужно передать значения dict в Bike конструктор перед использованием. Или, смотрите namedtuple -- кажется, больше соответствует тому, что вы пытаетесь сделать.


Это списки, потому что вы вводите их как списки в словаре:

bikes = {
    # Bike designed for children"
    "Trike": ["Trike", 20, 100],
    # Bike designed for everyone"
    "Kruzer": ["Kruzer", 50, 165]
    }

вы должны использовать велосипед-класса вместо:

bikes = {
    # Bike designed for children"
    "Trike": Bike("Trike", 20, 100),
    # Bike designed for everyone"
    "Kruzer": Bike("Kruzer", 50, 165)
    }

Это позволит вам получить стоимость велосипедов с велосипедом.стоимость, как вы пытались.

for bike in bikes.values():
    profit = bike.cost * margin
    print(bike.name + " : " + str(profit))

теперь это будет печатать:

Kruzer : 33.0
Trike : 20.0