2006年10月2日月曜日

Python Developers Camp 2006 夏 オブジェクト指向入門

Python Developers Camp 2006 夏、2日目の午前中に行われたオブジェクト指向入門セッションのメモ。


Pythonでオブジェクト指向入門

森亮靖

ウォーミングアップ
 Pythonにおけるオブジェクト指向はあくまでもオプション
 オブジェクト指向を知らなくてもプログラムが書ける
 継承の概念を理解するのが重要
 classステートメントで作るオブジェクトはビルトインオブジェクトによく似ている
 Pythonのオブジェクト指向プログラミングはC++やJavaに比べると易しい
 ダイナミックな型付けのおかげで前もって変数を宣言する必要がない
 type()を使って、オブジェクトの型を調べることができる
 dir()を使うとオブジェクトの属性を調べることができる
 IDLE環境でビルトインオブジェクトをいろいろ調べると勉強になる
 IDLE環境でタイプ中にポップアップするヒントは学習にとても便利

クラスとインスタンス
 クラスとは自分で作れる型だと思えばよい
 listなどのビルトイン型は外から見ている限りクラスのように見える
 listを呼び出すとインスタンスオブジェクトができる
 listを継承してサブクラスを作ることができる
 listが便利だと思えれば、クラスの便利さも理解できる
 classステートメントが実行されるとクラスオブジェクトが作成される
 このクラスオブジェクトがビルトイン型と同じような働きをする

メソッド
 オブジェクト自身が持っている自身に対する操作
 Python的にはclassステートメントのボディーにネストされたdefステートメントで定義
 self引数を理解する、インスタンスを渡す
 1つだけの要素のタプルを使うときは(a,)のように,をつける。初心者がはまりやすい。

コンポジション
 オブジェクトのなかにオブジェクトを組み込むこと
 あるクラスのメソッドのなかで他のクラスのインスタンスを作成する
 このようなクラスをコンテナオブジェクト、メソッドをコンテナメソッドと呼ぶ

演算子のオーバーロード
 名前の前後に2つのアンダースコアがついた特殊なメソッドを使う
 このようなメソッドをフックメソッドと呼ぶ
 たくさんあるので、それぞれ調べると便利

コンストラクタ
 インスタンス作成と同時に何か処理をしたいときは、__init__という名前のメソッドを使う
 __init__をコンストラクタと呼ぶ

IS-A関係
 スーパークラスとサブクラスの関係

HAS-A関係
 コンポジション

ポリモーフィズム
 同じ名前のメソッドでもクラスによって意味が変わる

抽象クラス
 機能の一部をサブクラスに依存するクラス
 サブクラスで機能を実装しないといけない
 継承の話

デリゲーション
 委任、委譲などと訳される
 コンポジションの話
 Pythonでは__getattr__というメソッドを使う
 処理をあるオブジェクトからそのオブジェクトに組み込まれた他のオブジェクトへ委任すること

カプセル化
 カプセル化とデータの隠蔽は別の話
 カプセル化とはクラスの中にデータ/メソッドを封じ込めること
 Pythonではデータの隠蔽はできない
 クラスやインスタンスの属性はあらゆるプログラムで利用でき、値の抽出、値の変更を自由にできる
 データ隠蔽は不要という意見もある

ファクトリ
 クラスを渡すとインスタンスが返ってくるという関数
 C++などではむずかしいが、Pythonでは簡単に作れる

非結合メソッド
 <クラス名>.<メソッド名>という形で呼び出されたメソッド
 第一引数にインスタンスを指定する必要がある

結合メソッド
 <インスタンス>.<メソッド名>という形で呼び出されたメソッド
 自動的にインスタンスが渡される

新スタイルクラス
 ビルトイン型を継承したクラスは新スタイルクラス
 そうでないものはクラシッククラス
 適当なビルトイン型がないときはobjectというビルトイン型を指定すればよい
 多重継承のときのオブジェクトツリーの検索順が違う

__slots__属性
 インスタンス属性の名前を特定のものに限定することができる
 スペルミスしたときに新しい属性を作ってしまわないようにできる



0 件のコメント:

コメントを投稿