class Item:
def __init__(self, name, price, kind):
self.name = name
self.price = price
self.kind = kind
def getPrice(self):
return self.price
def getName(self):
return self.name
def getKind(self):
return self.kind
class Cart:
def __init__(self):
self.list = []
pass
def addItem(self, item):
self.list.append(item)
def getTotalsByKind(self, kind):
total = 0
for i in self.list:
if i.getKind() == kind:
total += i.getPrice()
t = '{:.2f}'.format(total)
print "The total for %s items is %s" %(kind, t)
3 に答える
メソッドの戻り値を出力しています。
メソッド呼び出しprint
の前からステートメントを削除します。.getTotalsByKind()
メソッド自体がすべての印刷を行います。
メソッドには明示的なステートメントがありませんreturn
。つまり、デフォルトの戻り値None
が使用されます。
>>> def foo():
... # Nothing is returned in this function
... print 'Bar!'
...
>>> print foo()
Bar!
None
>>> foo()
Bar!
より良い代替手段は、メソッドが出力する文字列を返すようにすることです。
def getTotalsByKind(self, kind):
total = 0
for i in self.list:
if i.getKind() == kind:
total += i.getPrice()
t = '{:.2f}'.format(total)
return "The total for %s items is %s" %(kind, t)
返された文字列を印刷するだけでなく、さまざまなことができるようになりました。
文字列を出力するのではなく、getTotalsByKind
返すようにする必要があります。これを行うには、次の行を作成します。
print "The total for %s items is %s" %(kind, t)
このような:
return "The total for %s items is %s" %(kind, t)
これで、 の結果を印刷するgetTotalsByKind
と機能します。
関数は、デフォルトでは、返さNone
ずに自分自身の最後に到達した場合に返されます。そして、(あなたがしなければならない)print
withを使用することで、 Python に の戻り値を出力するように指示しています。これはです。getTotalsByKind
getTotalsByKind
None
コードのこの部分は表示されていませんが、私の推測では、 を実行しているprint cart.getTotalsByKind(...)
ため、Python にその関数の戻り値を出力するように指示しています。しかし、何も返さないため、 を返しますNone
。代わりに、そのメソッドは合計を出力します。
不適切な名前のメソッドの犠牲になりました:合計が返さgetTotalsByKind
れることを意味しますが、合計は1 つしかなく、返される代わりに出力されます。代わりにこのメソッドに名前を付けます。または、名前を付けて、発信者に印刷 (およびフォーマット) を行わせます。次に、メソッドは次のようにはるかに簡単に記述できます。printTotalByKind
getTotalByKind
def getTotalByKind(self, kind):
return sum(item.price for item in self.list if item.kind == kind)
これはあなたの質問とは関係ありませんが、ゲッター メソッドは完全に不要であり、おそらく削除する必要があります。item.price
同じことを行うために関数を呼び出すオーバーヘッドは必要ありません。ピンジ。