非業務日誌

ファクシミリ駆動開発の現場からお届けします。

Pythonにおけるクラス

Python のクラス(javaとの比較)

Pythonのクラス

Python でクラスの書き方を調べたのでjavaとの比較で整理します。

# 商品
class Goods:
     def __init__(self, price):
             if price < 0:
                     raise ValueError('価格は0円を超えること')
             self._price = price # 価格
             self._tax = 0  # 消費税率
     @property
     def tax(self) -> float:
             return self._tax
     @tax.setter
     def tax(self, tax):
             if tax < 0.0 or 1.0 < tax:
                     raise ValueError('税率は0.0 〜 1.0 で入力')
             self._tax = tax
     @property
     def price(self):
         return int(self._price * (1.0 + self._tax))


goods = Goods(2000)
goods.tax = 0.18
print(goods.price)

結果は 2360

java で書くとしたら

僕が対外的に、使えると言える言語のjavaで書くとしたら

import java.math.BigDecimal;
/**
 * 商品
 */
public class Goods {
    // 価格
    private int price;
    // 消費税率
    private BigDecimal tax;

    public Goods(int price) {
        if (price < 0) {
          throw new IllegalArgumentException("価格は0円を超えること");
        }
        this.price = price;
        this.tax = BigDeceimal.ZERO;
    }

    public BigDecimal getTax() {
        return tax;
    }

    public void setTax(BigDecimal tax) {
        if (tax < BigDecimal.ZERO && BigDecimal.ONE < tax ) {
            throw new IllegalArgumentException("税は0 〜 1 で入力");
        }
        this.tax = tax;
    }

    public int price() {
        return BigDecimal.valueOf(getPrice()).multiply(tax).intValue();
    }
}

雑感

java

  • javaは呪文が長いのがアレだけど、オブジェクト指向のために作られた言語って感じです。「私をオブジェクト指向で書いて」って。
  • カプセル化が前提です。自クラスのフィールドにもアクセッサ経由で値を取得するようにすると、継承時に振る舞いを変えやすくなります。
  • ちなみに商品価格と税は関心が分離されると思われますので、実業務では同一クラスにしないです。軽減税率の実装もしにくくなりますし。

python

  • Pythonに関しては、「オブジェクト指向でも書けますよ、自分」感が出てる気がします(小並感)。
  • でも頑張ってPython覚えたいです。