先日は、
にてクラス変数について書きました。クラスではクラス内に変数を実装できるのですが、通常の指定を行うと関数内の変数のようにクラス内で使用することもできますが、関数とは事なり、
のように
【 クラス名.クラス変数名 】
で呼び出すことができます。関数では、
のように戻り値を使用して
のように関数を実行して処理を行う仕様になっていましたが、クラスの場合だと、
のようにクラス内に変数を記述するとクラス変数になるので、
のような形で変数に代入すると使用する子tができます。当然。これは値を取得した状態なので、print関数の引数にそのまま代入できますが、クラス変数は何処からでも呼び出すことが出来る仕様になっています。
これが、関数内の変数とクラス内変数の違いになりますが、クラスの場合、仕様書を作っておいて、値の違うデータを名称をつけて管理できるようになっています。
クラスとインスタンス
先日は、関数とクラスについて書きましたが、その中でクラス内で定義できるクラス変数について書きました。
クラス変数は、【 クラス内で使用できる変数 】 になっていますが、クラス内で通常の変数のように使用することが出来ます。これは、外部からアクセスできてもグローバル変数のように変更できないので、クラス内だけで処理が出来る構造になっています。
処理を行う際に役割分担をして、その役割を個別のクラスで行うような設計にした場合、グローバル変数のようにどこからでも変更できると処理が複雑になるのでクラスでまとめて管理することで処理の内容を明確にすることが出来ます。
クラスの場合、クラス内に変数を格納できるので、通常の変数のように記述をすれば複数の変数を格納できるのですが、この変数の名称を 【 クラス変数 】 と言います。クラス変数は外部から呼び出すことが出来るのですが、この際に関数のようなreturnで戻り値として使用するのではなく、
【 クラス変数の呼び出し 】
クラス名.クラス変数名
という形で呼び出すことができます。変数の利用をする際には
■ 単一の値
■ 複数の値(集合)
を扱うことが出来ますが、Pythonの場合だと、リストなども使用できるので多次元配列も使用できます。
こうした際にグローバル変数だとコード内でしか利用できませんが、クラスに格納すると前述の方法でどこから
でも呼び出すことが出来るようになります。この際に
【 コード内 】
クラス名.クラス変数名
【 外部モジュール 】
import モジュール名
クラス名.クラス変数名
と言う形で呼び出すことが出来ます。これが、クラス変数の使い方になります。
当然、この値は関数の引数としても仕様出るので、数値や文字列でリテラル(変数の値)を指定して処理を行う事が出来ます。
例えば、
のようなコードを書いた場合、クラス変数は先程の方法で呼び出す事が出来るので、
のようにリストを格納してデータを呼び出すことも出来ます。
関数を格納する
クラスには変数だけでなく関数も格納できるので、
■ クラス変数
■ クラス内の関数
を用いることで変数と関数を格納することが出来ます。この場合、関数の引数をクラス変数にして関数を実行するとその引数を参照して関数が実行することが出来ます。
例えば、
のようなコードを書いて実行すると、
のようになります。これは、関数の実行と同じなので、
のようにクラス変数を用意して
のように関数の実行時に暮らす変数を使用しています。これで引数を使用して関数を実行できるので
に記述した関数が実行できるようになっています。
クラスに処理を実装する
先程の処理では
■ クラス
■ 外部のコード
で実行していました。これは、クラスを従来の関数で分けて処理をしている状態になりますが、
■ クラス変数
■ 関数
の実装をしたクラスを用意して、別のクラス内でクラス内の関数を実行することもできるので、クラスの外にコードを書かなくても処理を実行できるようになっています。
例えば、
のようなコードがそれに該当しますが、
の部分で、変数と関数を実装して
の部分で実行するようになっています。このコードでは、
■ 数値の選択
■ 数値をリストのインデックスに適応
■ 引数を指定して関数の実行
■ 引数を参照して関数の実行
と言う流れになっています。その為、
のようにコマンドを打ち込んでコードを実行すると
のように入力待ちになるので
のように数値を入力すると、この数値がリストのインデックスとして使用されるので、Enterキーで確定させると
のようにもう一つのクラスに実装されている関数でリスト内のインデックスで指定した値が表示されます。
この処理を行うと自動で処理が実行されてしまうと思いますが、これがクラスを使った場合の処理になります。クラスは個別に実行するのではなく、そのまま実行されてしまうので、コードの先頭からそのまま実行される仕組みになっています。
モジュールとして使用する
C言語やC++の場合、コードを書いて.hの拡張子にしてコンパイルするとそのファイルをヘッダーファイルとして使用できるようになりますが、Pythonでは、同様に外部参照をするモジュールを作成することが出来ます。
Pythonの仕様として
■ 外部のPythonファイル内の関数
■ 外部のPythonファイル内のクラス
を利用できるので、関数を格納したPythonファイルを作成すると外部参照で自作の関数やクラスを使用できるようになります。これを行うと、
【 同じ処理を違うコードでも仕様可能になる 】
ので、そのファイルを保存しておいて、新規に作成するアプリケーションのPythonファイルと同じディレクトリ内に格納しておけば、そのまま利用できます。この時に同じ階層にしておけば通常の標準ライブラリのようにそのままファイル名だけで指定できるようになります。
先程のコードはファイルで保存されているので、ファイル名を指定すれば実行できるようになっていますが、別のPythonファイルを用意して
のようにimportを行うと
のようにsample1.pyのコードを使用することが出来ます。
ちなみに、外部の自作したモジュールを使用すると、
のように 【 __Pychace__ 】 というフォルダーが作成されますが、この中には、
のように 【 pycファイル 】 が生成されますが、これがCPythonでコンパイルされたモジュールになります。Pythonでは、外部モジュール参照型のコードを書いた場合、CPythonでコンパイルしたモジュールが生成され、これをキャッシュとして使用する仕様になっているのですが、モジュールの外部参照が生じるコードが実行されると必ずこのフォルダーとpycファイルが作成される仕様になっています。
その為、BASICとは処理の方法が全く異なり、高速化をする仕組みが最初から実装されています。
先程のコードでは、 【*】 を対象にすることで全てのモジュールを読み込んでいるので、関数の実行をするモジュールも起動していましたが、
のようにモジュールのみを読み込んで、個別に実行すると、読み込みだけでクラスが実行されることはなくなります。
のようになります。
import
Pythonでは、インストール直後に
■ 組み込み関数
■ 標準ライブラリ
が使用できるようになっています。Linux環境ではライブラリにtkと依存関係がある
■ tkinter
■ turtle
を最初から使用することが出来ないので、Tkl/tkのウィジェット部分のtkを別途インストールしないと使用することが出来ません。WINDOWS環境もインストーラーのTCL/tkのインストールをすると言う項目にチェックを入れていないと同じ状態になりますが、LinuxやMACでは後からインストールすることになります。
と言っても、Linux環境だと最初からPythonはインストールされているので、古いバージョンだとアップグレードが必要になる程度で済むのですが、標準ライブラリでウィジェット依存のあるものを使用する際にはtkをインストールすることになります。
Pythonで組み込み関数を使用する際には、そのまま処理を実装するだけですが、組み込み関数や外部ライブラリを使用する際にはimportでライブラリを読み込む必要があります。
この時の方法として、先程使用した
■ import モジュール名
■ from モジュール名 import メソッド名
のような方法があります。前者は読み込むだけなので、実行時には
【 関数 】
■ モジュール名.メソッド名()
【 クラス 】
■ モジュール名.クラス名
のようになりますが 【 from 〜 inport 〜 】 を使用した場合には、読み込んだモジュール名を省略できるので、fromの後に指定したモジュールやクラスを
【 関数 】
■ メソッド名()
【 クラス 】
■ クラス名
で指定できます。今回は、 【 * 】 を使用することで全てをこの状態で使用できるようにしていますが、標準ライブラリや外部ライブラリを使用する際にはこの2つの方法を用いることになります。
これとは別に
【 import randoem as rdm 】
のような書き方も存在しますが、これは、通常の外部参照のライブラリを読み込んだ後にコード内で略称を使用する時の記述術方法になります。この場合、標準ライブラリのrandomモジュールを読み込んで、コード内で使用する際にはrdmで呼び出せるようになります。例えば、randint()を呼び出す場合だと
【 通常の呼び出し 】
random.randint()
【 asで省略した時のの呼び出し 】
rdm.randint()
のようになります。公式サイトのオンラインマニュアルにもライブラリによってはfromを使うと問題が出る場合があるので、対象のモジュールについてはfromを使わずにimportを使うことが明記されていますが、読み込みを行う際には使用に合わせて使い分けることになります。
処理を塊で考える
今回は、従来のクラスの使い方ではなく、クラス内のブロックを使った処理の仕組みについて書いたのですが、
■ クラス内には変数と関数が実装可能
■ クラス単位で処理を分割できる
■ クラス間で連携することが出来る
ことについて書きました。今回の方法は、
【 処理をパーツとして扱う 】
ような考え方なので、電気工作で使用するモジュールのような構造にして使う方法になります。
この構造にすると
■ 変数はクラス内で完結する
■ モジュールを外部から呼び出せる
■ クラス単位で処理を分けることが出来る
■ クラス同士ので連携処理を考えることが出来る
ようになります。
通常のクラスの使い方をする場合でも
■ インスタンス変数
■ メソッド
を用意して、クラス内に 【 仕様書 】 となる
■ 仕様書の機能の項目
■ 動作する仕組み
を実装することになりますが、クラスでは、今回行ったように
■ データ
■ 処理
を格納できるようになっています。ただし、今回とは事なり、クラスの場合は、データを格納した実態を用意して動かすので、
【 名称をつけてデータを格納したもの 】
を生成した後にそれを使用してメソッドを動かすことになります。
その為、クラスの基本構造は今回のようなデータと処理を一つにまとめたものになりますが、これをさらに自由度の高い状態で使用できるようになっています。