初学者Python:AttributeError:'list'对象没有属性

Cha*_*son 17 python dictionary class list attributeerror

错误说:

AttributeError: 'list' object has no attribute 'cost' 
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下类来处理自行车字典的简单利润计算:

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]
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试用my语句计算利润时,我得到属性错误.

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

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

jed*_*rds 19

考虑:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

33.0
20.0

不同之处在于,在bikes字典中,您将值初始化为列表[...].相反,它看起来像你的代码的其余部分想要Bike实例.所以创建Bike实例:Bike(...).

至于你的错误

AttributeError: 'list' object has no attribute 'cost'
Run Code Online (Sandbox Code Playgroud)

当您尝试调用,这将出现.cost一个上list对象.非常简单,但我们可以通过查看您调用的位置来弄清楚发生了什么.cost- 在这一行:

profit = bike.cost * margin
Run Code Online (Sandbox Code Playgroud)

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

但由于您的类具有成本属性,因此您似乎尝试将Bike实例用作值,因此我做了一点改变:

[...] -> Bike(...)
Run Code Online (Sandbox Code Playgroud)

你们都准备好了.


mra*_*agh 5

Bike在使用之前,您需要将字典的值传递到构造函数中。或者,看看namedtuple-- 似乎更符合您想要做的事情。


小智 5

它们是列表,因为您在字典中将它们作为列表键入:

bikes = {
    # Bike designed for children"
    "Trike": ["Trike", 20, 100],
    # Bike designed for everyone"
    "Kruzer": ["Kruzer", 50, 165]
    }
Run Code Online (Sandbox Code Playgroud)

您应该改用自行车类:

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

这将使您能够像您尝试使用的那样通过 bibk.cost 获得自行车的成本。

for bike in bikes.values():
    profit = bike.cost * margin
    print(bike.name + " : " + str(profit))
Run Code Online (Sandbox Code Playgroud)

现在将打印:

Kruzer : 33.0
Trike : 20.0
Run Code Online (Sandbox Code Playgroud)