型オブジェクト(クラスオブジェクト)

クラスはオブジェクト

pythonでは関数はおろか、クラスでさえもただのオブジェクトの一種です。

どういうことでしょうか?クラスをオブジェクトとして扱ったサンプルを確認してみましょう。

class Coordinate:
    """ 座標クラス """

    def __init__(self):
        """ 初期化 """
        self.x = 0
        self.y = 0

    def move(self, x, y):
        """ 平行移動 """
        self.x += x
        self.y += y

    def show_coordinate(self):
        """ 座標を表示する """
        print(self.x, self.y)

    def __str__(self):
        """ 文字列表現を返す """
        return "({0},{1})".format(self.x, self.y)


# クラスを普通にインスタンス化する
cood = Coordinate() # 普通にインスタンスを生成する
cood.x = 100 # メンバxに代入
cood.y = 200 # メンバxに代入
cood.show_coordinate() # メソッドを利用する

# クラスをオブジェクトとして扱う
C = Coordinate # Coordinateクラスのオブジェクトとして変数Cに代入する
cood2 = C() # Cからクラスを生成する 
cood2.x = 300
cood2.y = 600
cood.show_coordinate()

このようにCoordinateというクラスオブジェクトを別の変数に代入してからインスタンス化することが可能です。

もちろん引数にしたり戻り値にすることも可能です。

このようにしてクラス自体をオブジェクトとして扱うことができ、クラスをオブジェクトとしてみなす場合、クラスのことを、型オブジェクトやクラスオブジェクトと呼びます。実装上はtype型と呼ばれます。

クラス属性

さて、繰り返しになりますがpythonではクラスは単なるオブジェクトです。したがって、属性を持つことが可能です。これをクラス属性と呼ぶこともあります。

例えば、以下のようにremarkを定義すると、クラス属性となります。

class MyClass():
    remark = "A"

    def __init__(self):
        self.text = "sample text"

c1 = MyClass()
c2 = MyClass()

# クラス変数にアクセスする
print(c1.remark, c2.remark, MyClass.remark) # A A A

# クラス変数を変更する
MyClass.remark = "B"
print(c1.remark, c2.remark, MyClass.remark) # B B B

アクセス方法は変数名.属性名か、クラス名.属性名でアクセスできます。

サンプルのとおり、クラス属性を変更すると、すべてのインスタンスに反映されるので取り扱いには注意してください。