クラス_1(Python_21)

この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、オブジェクトについて学びました。Pythonの中核を占める要素です。

今回はクラスです。クラスを使ってオブジェクトを作ることができます。どのような仕組みになっているのでしょうか。

クラスとは

前回ご紹介したオブジェクトは、データ型を持っているとお話しました。Pythonでは、プログラマーが独自のデータ型を定義してオブジェクトを作ることができます。それがクラスという仕組みです。クラスは以下のように記述します。

class クラス名:
    # クラスの定義

また、定義したクラスによりオブジェクトを作るには、以下のように記述します。

クラス名(引数の列挙)

以下は、クラスからオブジェクトを作成した例です。

class ClassTest:
    pass

c1 = ClassTest()
print(id(c1)) # オブジェクトID 2273746857040(環境により異なる)を返す
print(type(c1)) # データ型 <class '__main__.ClassTest'>を返す
print(c1) # 値 <__main__.ClassTest object at 0x0000021165DFAC50>

オブジェクトID、データ型、値を持ったオブジェクトが作成されました。データ型の先頭についている'main'は、直接実行しているという意味です。値として表示されている「0x0000021165DFAC50」は、オブジェクトIDの16進表記です。関数と似ていますね。

objectクラス

上に紹介したクラスの定義方法は、記述を省略している部分があって、正しくは以下のように書きます。

class ClassTest(object):
    pass

「object」は、Pythonがすべてのオブジェクトの基盤として用意している「objectクラス」を指しています。クラスは、すでにあるクラスをもとに作ることができます。この時クラス名に続いて、元になるクラスの名前を括弧の中に列挙します。この機能は「継承」と呼ばれるものです。別の機会にご紹介したいと思います。

継承の機能を使って、objectクラスにあらかじめ設定してある機能を作成するクラスにも定義できます。 定義されている機能は、dir関数で確認できます。以下のスクリプトを実行してみましょう。

print(dir(ClassTest))

結果は以下の様になりました。

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__',
 '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__',
 '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
 '__weakref__']

これだけの機能が最初から定義されているんですね。個別の機能については、別の機会にご紹介したいと思います。

クラスもオブジェクト

Pythonでは、オブジェクトとはプログラムの実行時にコンピューターのメモリ上に作成された物を指す」と以前説明しました。それではクラスもオブジェクトなのでしようか。以下のスクリプトで確認してみましょう。

class ClassTest(object):
    pass

print(id(ClassTest)) # 1787824321440(環境により異なる)を返す
print(type(ClassTest)) # <class 'type'>を返す
print(ClassTest) # <class '__main__.ClassTest'>を返す

クラスもオブジェクトなんですね。クラスのオブジェクトはtype型になります。値として返ってきた内容は、このクラスをもとに作成したオブジェクトのデータ型と一緒です。

それではobjectクラスはどうでしょうか。

print(id(object)) # 1787824321440(環境により異なる)を返す
print(type(object)) # <class 'type'>を返す
print(object) # <class 'object'>を返す

やっぱりオブジェクトなんですね。そしてやっぱりtype型です。

次回もクラス

いかがでしようか。Pythonって結局全部オブジェクトなんですね。今回は空っぽのオブジェクトを作っただけで終わってしまいました。次回から内容の充実に取り組んでいきます。お楽しみに!!

hirocom777.hatenadiary.org

Python再学習のまとめはこちら!!