pythonでいろいろ

pythonをいじりながら気になったことをメモしていきます

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」で確認。

コンポジション

オブジェクトの階層構造。クラスが入れ子構造になる。

継承等はまた次回…。