クラス変数
このレッスンでは、クラス変数を使って、全インスタンスで共有する値を1か所に置けるようになります。
同じ数字がコードのあちこちに散る
前のレッスンの total には 1.1 という数字が直に書かれていました。税率を使う場所が増えると、この数字がコードのあちこちに現れます。税率が変わったときに1つ直し忘れれば、そこだけ古い金額が出続けます。
こういう「全員で共有したい値」は、クラス変数として class 文の直下に置きます。
class Expense:
TAX_RATE = 0.1
def __init__(self, name, price):
self.name = name
self.price = price
def total(self):
return int(self.price * (1 + Expense.TAX_RATE))インスタンス変数との違い
self.price はインスタンス変数で、インスタンスごとに別の値を持ちます。牛乳の 158 とトマトの 240 は別物です。
いっぽう TAX_RATE はクラスに1つだけあり、すべてのインスタンスが同じものを見ます。読むときは Expense.TAX_RATE とクラス名から書くのが確実です。self.TAX_RATE でも読めますが、書き込みだけは事情が違います。
Expense.TAX_RATE = 0.08 # 全インスタンスに効く
milk.TAX_RATE = 0.08 # milk だけに新しい属性ができるself.TAX_RATE = ... と書くと、クラス変数は変わらず、そのインスタンス専用の属性が新しくできてしまいます。共有の値を書き換えたいときは必ずクラス名から代入してください。
定数は大文字で書く
Python には定数の文法がありません。そのかわり、変えないつもりの値は TAX_RATE のように大文字とアンダースコアで書く慣習があります。読む人に「これは書き換えない値だ」と伝わります。
金額は整数に丸める
税率は 0.1 という float なので、掛け算の結果には誤差が乗ります。合計を出す前に、1件ずつ int() で整数に丸めてから足してください。丸める前の float を足してしまうと、合計だけ 1 円ずれることがあります。
要件
- class 文の直下にクラス変数 TAX_RATE を 0.1 で定義すること
- total は int(self.price * (1 + Expense.TAX_RATE)) を返すこと
- tax_included_total は Expense.TAX_RATE に引数 rate を代入してから合計すること
- 1 件ずつ整数に丸めてから合計すること
入出力例
tax_included_total([["牛乳",158],["トマト",240],["書籍",1600]], 0.1) → 2197
tax_included_total([["牛乳",158],["トマト",240],["書籍",1600]], 0.08) → 2157ヒント
編集 LuaGate編集部