第10回 Python座学 オリジナルのオブジェクト1

プログラミング

クラス

プログラムでやるべき処理が増えてくると関数だけではまかないきれなくなります
そうなると、関数を用途別にまとめるものが必要になってきます
それが「クラス」です
クラスはオブジェクト指向言語のキモとなり、使うことでプログラミングの幅が広がります
Pythonのint型やstr型などはすべてクラスで定義されています
いままで「int型のオブジェクト」や「str型のオブジェクト」と言っていたのは正確には
「intクラスのオブジェクト」「strクラスのオブジェクト」になります
このオブジェクトは正確に言うと「クラスから作られた物体」です
Pythonにおいて「number=5」と書くと、コンピューターのメモリ上に5という値を読み込みます
そして、ただ単に5をメモリに置くのではなく「この値はint型である」という制約をかけます
つまり、「オブジェクトとはクラスによって作られたメモリ上の領域」ということになります

  • クラスの定義
    class クラス名:
    メッソドの定義…

クラスの作成

まずはオリジナルのオブジェクトを作ってプログラムを個性的なものにしてみましょう
オブジェクトを作るには、まずその定義が必要で、それが「クラス」です
オブジェクトはクラスから作られ、数に制限はありません
このことから、「クラスはオブジェクトの設計図」「クラスはオブジェクトの工場」、「クラスはオブジェクトを実体化し振る舞いを定義するもの」とまで言われています
クラスは「classキーワード」を使て定義します

オリジナルのクラス=オブジェクト

先ほど作ったクラスには「_init_()」と「narrator()」という2つのメソッドか定義されています
オブジェクトが備えるメソッドはこのように内部で定義されています

  • オブジェクトがの初期化を行う「_init_()」

クラスの定義において「_init_()」というメソッドは特別な意味を持ちます
クラスからオブジェクトが作られた直後に、オブジェクトの内部でそのあとの使用に備えなければならないことがあります

例えばカウンターの値を0にする、必要な情報をファイルから読み込むなどです
「初期化」を意味するinitialiseの先頭4文字をアンダースコアで囲んだ「__init__()」というメソッドはオブジェクトの初期化を意味し、オブジェクト作成直後に自動的に呼び出されます

  • def __init__ (self, パラメーター2, パラメーター3) :
    初期化のための処理・・・

__init__()メソッドに限らず、Pythonではすべてのメソッドの決まりとして、第1パラメーターは「self」でなければなりません
これは「メソッドを呼びだすときは呼び出し元のオブジェクトを明示的に渡す」というPython特有のしきたりがあるからです
ただし、必ずしもselfである必要はなく「my」や「me」でも可です
あくまで慣用的にselfが使われているだけです
selfパラメーターの後には、必要な数だけ独自のパラメーターの設定できるので、与えられた情報を初期化処理に利用することができます

  • インスタンスごとの情報を保持するインスタンス変数

例のselfの次に設置したmaxというパラメーターで取得した値を「self.max」という変数に代入しています
ここでselfが使われていますが、self.maxはインスタンス変数を表しています
インスタンスとはクラスの実態、つまりはオブジェクトを表す言葉ですが「メモリ上に読み込まれているオブジェクトそのもの」を指す場合にインスタンスという言葉が使われます
クラスからはいくつでもオブジェクトを作ることができるので「個々のオブジェクトを指すときにインスタンスという言い方をする」と覚えてください

  • インスタンス変数の書式
    self.インスタンス変数名 = 値

インスタンス変数とは、インスタンスが独自に保持する情報を格納するための変数です
1つのオブジェクトはいくつでも作れますが、これまで何度も出てきた文字列オブジェクトがそうであったように、それぞれのインスタンスは別々の情報を保持できます
このようなオブジェクト固有の情報は、インスタンス変数を利用して保持するというわけです
この時どのインスタンスかを示すのがselfの役割です
パラメーターselfには、呼び出し元、つまりクラスのインスタンスの参照情報が渡されてくるので「self.max」は「インスタンスの参照.max」という意味になり、そのインスタンスが保持している変数maxを指すようになります

  • __init__()メソッドの処理

上の画像の場合、インスタンス変数は「self.max」と「self.count」の2つです
どちらも「__init__()」メソッド内での代入により初期化されます

「インスタンス変数self.max」と「パラメーターmax」は全く別の変数であることに注意してください
「self.max = max」という代入式により、パラメーターmaxが指すオブジェクトをself.maxも指すようになります
例えば、maxに5という数値が与えられていたら、self.maxも5を指し示すようになり、そのようにして作られたオブジェクトはself.maxによって5という情報を保持するようになります
オブジェクトを作るときに__init__()メソッドに引数として情報を渡すことで、オブジェクトに個性を与えているのです
一方でself.countの方は0を直接代入しているので、どのオブジェクトも初期化された直後はこのインスタンス変数についての違いはありません