お湯を沸かすのに必要な熱量が知りたかったから

ガスでお湯を沸かすのに何ジュールの熱量が必要なのか気になって、ポチポチ計算してたんだけど、せっかくだからコードにしとくかと思って書いてみた。最近Python触る機会も増えたから練習も兼ねてる。

"""
水の温度変化に必要な熱量の単位変換を行うクラス
"""
class WaterCalory:
    """
    水の熱量
    """ 
    def __init__(self, ml : int, delta_temp : int):
        # 水の量 ミリリットル
        self.ml = ml
        # 温度の上昇
        self.delta_temp = delta_temp

    @classmethod
    def factory(cls, ml : int, from_temp : int, to_temp : int):
        return cls(ml, to_temp - from_temp)

    def cal(self) -> int:
        # カロリー
        return self.ml * self.delta_temp

    
    def to_joule(self) -> int:
        # ジュール
        return self.cal() * 4.184

    
    def to_mega_joule(self) -> int:
        # メガジュール
        return self.to_joule() / 1_000_000


    def format_in_mega_joule(self) -> str:
        # メガジュールで少数3桁までの文字列にする
        return f"{self.to_mega_joule():.3f} MJ"
import unittest

from water_calory import WaterCalory

class TestUnionFind(unittest.TestCase):

    def test(self):
        wc = WaterCalory(1000, 60)

        self.assertEqual(
            wc.cal(),
            60_000,
            "1000mlの水を60度上昇させるのに必要な熱量は60,000カロリー"
        )

        self.assertEqual(
            wc.to_joule(),
            251_040,
            "1000mlの水を60度上昇させるのに必要な熱量は251040ジュール"
        )

        self.assertEqual(
            wc.to_mega_joule(),
            0.251040,
            "1000mlの水を60度上昇させるのに必要な熱量は0.251040メガジュール"
        )

        self.assertEqual(
            wc.format_in_mega_joule(),
            "0.251 MJ",
            "1000mlの水を60度上昇させるのに必要な熱量は0.251メガジュール"
        )

    def test2(self):
        wc = WaterCalory.factory(ml=1000, from_temp=10, to_temp=70)

        self.assertEqual(
            wc.cal(),
            60_000,
            "1000mlの水を60度上昇させるのに必要な熱量は60,000カロリー"
        )

        self.assertEqual(
            wc.to_joule(),
            251_040,
            "1000mlの水を60度上昇させるのに必要な熱量は251040ジュール"
        )

        self.assertEqual(
            wc.to_mega_joule(),
            0.251040,
            "1000mlの水を60度上昇させるのに必要な熱量は0.251040メガジュール"
        )

        self.assertEqual(
            wc.format_in_mega_joule(),
            "0.251 MJ",
            "1000mlの水を60度上昇させるのに必要な熱量は0.251メガジュール"
        )

何ジュールか変換できるようにしたから、ついでに都市ガスのジュール/立方メートル調べてガスの使用量に変換できるようにして、ガス料金の限界費用調べれば、お湯を沸かすのに必要な費用がわかる。

湯たんぽ 通販 | 無印良品