Python実践入門 6章 クラス
クラスの継承
code: 継承.py
class クラス名(基底クラス名):
def メソッド名():
__特殊メソッド__は特殊メソッドの形式
__init__()はインスタンスの初期化を行う特殊メソッド、コンストラクタとは厳密には違う
コンストラクタは引数と一緒にオブジェクトを生成するもの
__init__はイニシャライザと言われ、インスタンス生成後に処理が行われる
Pythonでのコンストラクタは__new__()が該当する
クラスオブジェクトでインスタンスを生成した場合は、まず__new__()が呼び出されこの返り値が__init__()の第一引数selfに渡される
__new__()は悪用可能なので、ライブラリ作成などでどうしても必要でない限り利用は避けて__init__のみを使うこと
プロパティ
@propertyをアノテーションみたいに付与したインスタンスメソッド(こういうアノテーションをPythonではデコレーターというらしい)
()なしで呼び出されるようになって、インスタンスメソッドをインスタンス変数的に扱えるらしい
慣習として、_を頭につけた変数やメソッドはプライベートなものとして扱います
Pythonのコミュニティとして、_がついたプライベートメソッドは参照しないというのを各ユーザーが意識するというようにしている
esaka.icon 言語仕様として呼び出せないようにされてないのはやっぱ嫌だな。。
クラス変数
クラスオブジェクトに紐ずく(インスタンスからも参照できる、全てのインスタンスで共有される)
更新する場合はインスタンスの変数更新でなく、<Class名>.<クラス変数> = 新しい値で更新しないといけない
クラスメソッド
アノテーション的に@classmethodを付与したメソッドはクラスメソッドになる
一般的には第1引数をselfでなく、clsとすることが多い
スタティックメソッド
@staticmethodで作成
クラス変数やインスタンス変数を使わない、一般的な関数とかに使う
Pythonは多重継承(MixIn)をできる
code: 多重継承.py
class クラス名(基底クラス名1, 基底クラス名2):
def メソッド名():
多重継承は菱形継承の問題がある
基底クラス名1, 基底クラス名2それぞれで同名で別々の処理のメソッドを定義しており、そのメソッドを継承した場合両方呼ばれてしまう
メソッド解決順序は Method Resolution Orderで検索かければ出るらしいよ
<クラス名>.__mro__ で解決順はわかるらしい