【Python】クラスを使ってみよう!

Pythonロゴ

クラスとは?

インターネットで調べると処理や情報をまとめたものという説明を多く見ます。
私自信の勝手な解釈になるのですが、クラスは製造工場と同じような物という認識で考えています。
工場には、部品を作る機械がたくさんあり、作った物を一時保管する場所もあります。
部品を作る機械 = メソッド(関数)
一時保管場所 = クラス変数、インスタンス変数

クラスの基本操作

クラスの作成

クラスの作成は下記の構文で行われます。クラス名は最初の文字を大文字にするルールが推奨されています。

class クラス名(object):
    # コンストラクタ
    def __init__(self, tax_rate):
        # クラスを呼び出されたときに実行

    def 関数名(self, 引数):
        return 戻り値

    # デストラクタ
    def __del__(self):
        # クラスを削除されたときに実行

test = クラス名()  # この段階でコンストラクタ呼び出し
del test          # この段階でデストラクタ呼び出し
class Item1(object):
    # コンストラクタ
    def __init__(self, tax_rate):
        self.tax_rate = tax_rate * 0.01

    def tax_price(self, price):
        return int(price + price * self.tax_rate)

    # デストラクタ
    def __del__(self):
        self.tax_rate = 0
        print('tax end')


item = Item1(10)
print(item.tax_price(100))
del item

# 結果
# 110
# tax end

クラスの継承

基底クラスの機能を持った派生クラスを作ります。
下記の場合「Item2a」のメソッド等を維持した状態で「Item2b」を作成して「tax_price_total()」を追加しています。

class Item2a(object):
    def __init__(self, tax_rate):
        self.tax_rate = tax_rate * 0.01

    def tax_price(self, price):
        return int(price + price * self.tax_rate)

class Item2b(Item2a):
    def tax_price_total(self, price, count):
        return int(price + price * self.tax_rate) * count

item = Item2b(10)
print(item.tax_price(100))
print(item.tax_price_total(100, 5))
del item

# 結果
# 110
# 550

クラスの書き換え

基底クラスの機能を持った派生クラスを作り、一部メソッドをオーバーライドして機能の変更をおこなっています。

class Item3a(object):
    def __init__(self, tax_rate):
        self.tax_rate = tax_rate * 0.01

    def tax_price(self, price):
        return int(price + price * self.tax_rate)

class Item3b(Item3a):
    def tax_price(self, price):
        return price + price * self.tax_rate

item = Item3b(10)
print(item.tax_price(100))
del item

# 結果
# 110.0

クラス変数

クラス内で使える変数を設定します。設定された変数は self にて所属するメソッドで参照・書き換えが行えます。

class Item4(object):
    tax_rate = 0.1  # クラス変数

    def tax_price(self, price):
        return int(price + price * self.tax_rate)

item = Item4()
print(item.tax_price(100))
del item

# 結果 110

クラスメソッドとスタティックメソッド

クラスの呼び出しがきちんとできていない場合、self を使った変数参照ができません。下記の場合はクラスメソッドを使うことで対策ができます。

class Item4(object):
    tax = 10

    def __init__(self):
        self.tax_rate = self.tax * 0.01

    @classmethod
    def get_tax(cls):
        return cls.tax

item = Item4()  # クラスが呼び出しされて __init__ まで処理済み
print(item.get_tax())
del item

item = Item4    #  ()がないためクラスが呼び出しされていない
print(item.get_tax()) # クラスメソッドのおかげで変数が参照できる
del item

# 結果
# 10
# 10

クラスメソッドを使用しない場合、下記プログラムだとItem4のクラスがきちんと呼び出されていないため self を使って変数を参照できない。

class Item4(object):
    tax = 10

    def __init__(self):
        self.tax_rate = self.tax * 0.01

    def get_tax(self):
        return self.tax

item = Item4    #  ()がないためクラスが呼び出しされていない
print(item.get_tax()) # きちんと呼び出しできていないためエラー
del item

# 結果
# Traceback (most recent call last):
#  File "/opt/project/object.py", line 8, in <module>
#    print(item.get_tax())
# TypeError: get_tax() missing 1 required positional argument: 'self'

特殊メソッド

先ほど「コンストラクタ」や「デストラクタ」などクラスを作成する際に標準で導入されているメソッドがあります。
メソッドの詳細はPython公式サイトをご確認下さい。

参考 特殊メソッドについてPython ドキュメント

サンプルプログラム

こちらの記事で作成したプログラムはGitHub環境にアップしております。
下記からダウンロードいただけます。

参考 object.py スクリプトGitHub python-beginner