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 件のコメント:
コメントを投稿