エラーは言います:
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
まず、なぜリストを参照しているのかわかりません。すべてが定義されているようです。
考慮してください:
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
これは、少なくとも1つのbike
(つまり、bikes.values()
のメンバーがリストであること)を示します。 bikes
を定義した場所を見ると、実際には値がリストであることがわかります。したがって、このエラーは理にかなっています。
しかしyour classにはコスト属性があるため、Bike
インスタンスを値として使用しようとしているように見えたので、少し変更しました。
[...] -> Bike(...)
そして、あなたはすべて設定されています。
そのように使用する前に、dictの値をBike
コンストラクターに渡す必要があります。または、namedtuple
を参照してください-あなたがやろうとしていることともっと一致しているようです。
辞書でリストとして入力するため、これらはリストです。
bikes = {
# Bike designed for children"
"Trike": ["Trike", 20, 100],
# Bike designed for everyone"
"Kruzer": ["Kruzer", 50, 165]
}
代わりにbike-classを使用する必要があります。
bikes = {
# Bike designed for children"
"Trike": Bike("Trike", 20, 100),
# Bike designed for everyone"
"Kruzer": Bike("Kruzer", 50, 165)
}
これにより、bike.costを使用して、目的の自転車のコストを取得できます。
for bike in bikes.values():
profit = bike.cost * margin
print(bike.name + " : " + str(profit))
これで印刷されます:
Kruzer : 33.0
Trike : 20.0