Pythonのオブジェクト指向
自分はPerlやshなどのスクリプトやCの入り口程度は知って使って来ましたしたが、オブジェクト指向についてはCのポインタから逃げ出して以降、あまり調べず使わずにきました。 ですが、Pythonのソースを読んだり、他人のライブラリを使おうとすると、どうしても知って使える必要が出てきました。
そんな自分用のメモです。
オブジェクト指向の単語
よく分からないことはまず単語からよく分からないし、聞き覚えのない事ばかりなので、逐一メモしていきます。
カタカナ語が多くて、しかも毎回引っかかるので読み進めにくいんですよね。3D CADにおける「ソリッド」や「サーフェス」みたいな。、
構造体→クラス
オブジェクト指向は「データ」と「処理」をひとまとめにするもの。タプルや辞書と似てるが違う。大きく異なるのが参照と代入。
「変数名.データ名」で参照する。
構造体に関数をもたせたものといえる。
Pythonとしてはめずらしくデータ名の宣言が必要。クラスの名前とデータ名を宣言(def __init__
やself)する。
使い方
name = ClassName()
で、nameというインスタンスがClassNameクラスから作成される。
インスタンス
クラスから作られた実際のデータがインスタンス。「インスタンス名.データ名」でデータにアクセスできる。
メソッド
クラス内で定義された関数が「メソッド」。インスタンス内のデータを操作するなど。class宣言内で def 関数(self)で定義する。
「self.データ名」でクラス内の変数をメソッドが参照できる。
「インスタンス名.メソッド名()」でメソッドを呼び出す。(「定義された第一引数は呼び出しに利用されない」…なので、argumentsのエラーなどで一つ数が合わないときがある。selfで一つはすでに引数で与えているから?)
コンストラクタ
def __init__(self):
これもメソッドの一つで、インスタンス作成時に実行される。これがコンストラクタ。インスタンス作成時に引数で与えて初期化をするようにすると、特定のデータの初期化が忘れなくて良い・・・らしい。
実装の隠匿
「何を外に見せて、何を隠すか」がオブジェクト指向だと容易に実現できる。
クラス変数とインスタンス変数
スコープが関わってくる。クラスが同じならばインスタンス同士でもスコープが同じ。def __init__
外で定義したクラス変数は「クラス名.変数」で他インスタンスでもアクセスできる。
クラスの属性の確認
print (str(dir(instance)))
これでinstanceの属性一覧が分かる。「dir」で確認。
コンポジション
オブジェクトの階層構造。クラスが入れ子構造になる。
継承等はまた次回…。