Python/Class
目次 |
基本事項
クラスを定義するには、
class ClassName(SuperClass):
definition
のように書く。
メソッドの定義
通常の関数と同様、defにより定義する。メソッドと関数の違いは、メソッドの第一引数が常にオブジェクト自身を指す参照として扱われることである。慣例として、メソッドの第一引数には「self」という名前をつける。
class ClassName:
def methodName(self, arg1, arg2):
definition
メソッドのオーバーライド
同名のメソッドを定義するだけである。Pythonにおいて、すべてのメソッドはvirtualである。
特殊なメソッド
コンストラクタ/デストラクタ
コンストラクタ、デストラクタは、それぞれ__init__、__del__という既定の名前を持つメソッド。デストラクタが呼び出されるのは、GCによりオブジェクトがメモリ上から削除されるタイミングである。したがって、正確な呼び出し時期を予測することは困難である。
基底クラスのコンストラクタ、デストラクタが自動的に呼び出されることはない。必要なら、派生クラスはコンストラクタ、デストラクタにおいて、明示的に基底クラスの__init__メソッドおよび__del__メソッドを呼び出すことができる。第一引数にselfを与えなければならないことに注意。
class DerivedClass(BaseClass):
def __init__(self):
BaseClass.__init__(self)
def __del__(self):
BaseClass.__del__(self)
派生クラスの__del__で基底クラスの__del__を呼び出す場合には注意が必要である。Pythonプログラムが終了する際、__del__が呼び出される前に、基底クラスのクラスオブジェクトがネームスペースから削除されていることがあるからだ。このような場合、プログラム終了時に以下のようなエラーが出力される。
Exception exceptions.AttributeError: "'NoneType' object has no attribute '__del__'"
解決方法は、デフォルト引数を用いて基底クラスオブジェクトへの参照を増やすことである。
class DerivedClass(BaseClass):
def __del__(self, BaseClass=BaseClass):
BaseClass.__del__(self)
演算子のオーバーライド
オーバーライド可能な演算子と、対応するメソッド呼び出しは以下のとおり。 いずれのメソッドも、戻り値は真偽値である。
| 演算子 | 等価なメソッド呼び出し |
|---|---|
| x > y | x.__gt__(y) |
| x < y | x.__lt__(y) |
| x == y | x.__eq__(y) |
| x != y | x.__ne__(y) |
| x >= y | x.__ge__(y) |
| x <= y | x.__le__(y) |
上記のメソッドが定義されていない場合に比較操作が行われると、__cmp__という名前のメソッドが呼び出される。このメソッドは、左辺が右辺よりも小さい場合には負の値、左辺が右辺と等しい場合は0、左辺が右辺より大きい場合は正の値を返さなければならない。__cmp__も定義されていない場合、オブジェクトのアドレスにより比較が行われる。