みんPy(改訂版) 読書メモ Chapter 9

Chapter 9 クラスの継承と高度なオブジェクト指向機能

スーパークラスの指定

class <クラス名>(<スーパークラス名>[,スーパークラス名2,...]):
    # classdefs
    :
    :

多重継承が可能。

オーバーライド

スーパークラスのメソッドと同名のメソッドをサブクラスで改めて定義する(Pythonの関数/メソッドの同一性は名前だけで判断される(たぶん))。

親クラスの初期化メソッド/メソッド呼び出し

初期かメソッドのオーバーライドをしても、自動で親クラスの初期化メソッドは呼び出されない。 クラス名指定または、組み込み関数 super() を使用する( super() は、新スタイルクラスでのみ使用可能)

class Super(object):
    def __init__(self):
        print 'initializing Super'

class Sub1(Super):
    def __init__(self):
        Super.__init__(self)        # クラス名指定で__init__()呼び出し。この場合はselfを第一引数に渡す必要がある。
        print 'initializing Sub1'

class Sub2(Super):
    def __init__(self):
        super(Sub2,self).__init__()    # super()関数による__init__()呼び出し。
        print 'initializing Sub2'

super()関数のドキュメント

新スタイルクラス

ver. 2 系では、object または組み込み型を親クラスとするクラスを作成することで新スタイルクラスとなり、使用できる機能が増える。(ver. 3 系ではすべてのクラスが新スタイルクラスとなる)。

スロット

__slots__ に文字列のリストを代入することにより、そのクラスに追加できるアトリビュートを制限することができる。

class Cls(object):
    __slots__ = ['a','b']

    def __init__(self):
        self.a = 1

c = Cls()
print c.a
c.b = 2
print c.b
c.c = 3        # ここでエラーとなる。
プロパティ

アトリビュートの設定時にメソッドを経由させることができる。

class Cls(object):
    
    def __init__(self):
        self.__value = 1
        return
        
    def set_value(self, value):
        print 'set value to ' + str(value)
        self.__value = value
        return
    
    def get_value(self):
        print 'get the value ' + str(self.__value)
        return self.__value

    value = property(get_value,set_value)

property() 関数のドキュメント

特殊メソッド

クラスに特殊メソッドを定義することで演算子オーバーライドなどを実現できる。

残術演算子

算術演算子のオーバーライドは、以下の特殊メソッドを定義する。いずれも2つの引数(self と演算対象)をとる。

  • __add__(self, other) : +
  • __iadd__(self, other) : +=
  • __sub__(self, other) : -
  • __isub__(self, other) : -=
  • __mul__(self, other) : *
  • __imul__(self, other) : *=
  • __div__(self, other) : /
  • __idiv__(self, other) : /=
  • __and__(self, other) : & (ビットAND)
  • __or__(self, other) : | (ビットOR)
比較演算子
  • __cmp__(self, other) : self < other なら負値、self == other なら 0、self > other なら正値を返却する。
  • __eq__(self, other) : 等しい場合に True、等しくない場合に False を返却する。
  • __ne__(self, other) : 等しくない場合に True を返却する。
  • __lt__(self, other) : self < other が成り立つ場合に True を返却する。
  • __le__(self, other) : self <= other が成り立つ場合に True を返却する。
  • __gt__(self, other) : self > other が成り立つ場合に True を返却する。
  • __ge__(self, other) : self >= other が成り立つ場合に True を返却する。

個別の演算子が定義されていればそちらが優先的に呼び出され、そうでない場合 __cmp__()が呼び出される。

型変換

型変換を行う組み込み関数の引数として指定された場合に呼び出される。 いずれも一つの引数 (self) をとる。

  • __int__(self) : int()
  • __float__(self) : float()
  • __str__(self) : str()print 文で表示する場合などにも呼び出される。
  • __repr__(self) : インタラクティブシェル等での文字列表現を取得する際に呼ばれる。__str__() が定義されていない場合、代わりに呼び出される。
  • __unicode__(self) : unicode()。このメソッドが定義されていない場合は、__str__()によって変換後、デフォルトエンコーディングユニコード文字列化される。
コンテナ型
  • __len__(self) : 組み込み関数 len() の引数に指定された場合に呼び出される。
  • __getitem__(self, key) : キーによる要素の参照時に呼ばれる。 e.g.) li[1] dic['key']
  • __setitem__(self, key, value) : キーによる要素の設定時に呼ばれる
  • __delitem__(self, key) : del文による要素の削除を行うときに呼ばれる。
  • __iter__(self) : 組み込み関数 iter() から呼ばれる。イテレータオブジェクト(next()メソッドを実装する)を返却する。
  • __contains(self, item) : in にて、要素が存在するかを検査する際に呼ばれる。True/Falseを返却する。
アトリビュートのアクセス
  • __getattr__(self, name) : オブジェクトに存在しないアトリビュートが参照されるときに呼び出される。
  • __getattribute__(self, name) : 新スタイルクラスでのみ使用できる。アトリビュートが参照されるとき無条件に呼び出される。
  • __setattr__(self, name, value) : アトリビュートに代入を行うときに必ず呼び出される。
その他
  • __call__(self[, args...]) : オブジェクト自体が関数のように呼び出された場合に呼ばれる。
  • __del__(self) : オブジェクトがメモリ上から消去されるときに呼び出される。del および ガベージコレクション時に呼ばれる。