web-dev-qa-db-ja.com

初心者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

まず、なぜリストを参照しているのかわかりません。すべてが定義されているようです。

16
Charles Watson

考慮してください:

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(...)

そして、あなたはすべて設定されています。

18
jedwards

そのように使用する前に、dictの値をBikeコンストラクターに渡す必要があります。または、namedtupleを参照してください-あなたがやろうとしていることともっと一致しているようです。

4
mragh

辞書でリストとして入力するため、これらはリストです。

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
4
Ygedey