初学者Python:attributeRor:“list”对象没有attribu

2024-05-12 07:39:18 发布

您现在位置:Python中文网/ 问答频道 /正文

错误显示:

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

首先,我不知道为什么它指的是一个列表,而一切似乎都被定义了,不是吗?


Tags: namemarginselfforobject错误weightcost
3条回答

在使用之前,需要将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

考虑:

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'

当您试图对list对象调用.cost时,将发生这种情况。很简单,但是我们可以通过查看您调用.cost的位置来了解发生了什么事情——在这一行中:

profit = bike.cost * margin

这表示至少有一个bike(即bikes.values()的成员是一个列表)。如果您查看一下定义的位置bikes,您可以看到这些值实际上是列表。所以这个错误是有道理的。

但是,由于您的类有一个cost属性,看起来您试图使用Bike实例作为值,所以我做了一点小小的更改:

[...] -> Bike(...)

你们都准备好了。

相关问题 更多 >