cls[, args...]) |
クラス cls の新しいインスタンスを作るために呼び出されます。 __new__() は静的メソッドで (このメソッドは特別扱いされている ので、明示的に静的メソッドと宣言する必要はありません)、インスタンスを 生成するよう要求されているクラスを第一引数にとります。残りの引数はオブ ジェクトのコンストラクタの式 (クラスの呼び出し文) に渡されます。 __new__() の戻り値は新しいオブジェクトのインスタンス (通常は cls のインスタンス) でなければなりません。
典型的な実装では、クラスの新たなインスタンスを生成するときには "super(currentclass, cls).__new__(cls[, ...])"に適切な引数を指定してスーパクラスの __new__() メソッドを呼 び出し、新たに生成されたインスタンスに必要な変更を加えてから返します。
__new__() が cls のインスタンスを返した場合、 "__init__(self[, ...])" のようにしてインスタンスの __init__() が呼び出されます。このとき、self は新たに生成 されたインスタンスで、残りの引数は __new__() に渡された引数と 同じになります。
__new__() が cls のインスタンスを返さない場合、インスタ ンスの __init__() メソッドは呼び出されません。
__new__() の主な目的は、変更不能な型 (int, str, tuple など) のサブクラスでインスタンス生成をカスタマイズすることにあります。
self[, ...]) |
self) |
x.__del__()
を呼び出しません --
前者は x
への参照カウント (reference count) を 1 つ減らし、
後者は x
への参照カウントがゼロになった際にのみ呼び出されます。
オブジェクトへの参照カウントがゼロになるのを妨げる可能性のある
よくある状況には、以下のようなものがあります: 複数のオブジェクト間
における循環参照 (二重リンクリストや、親と子へのポインタを持つツリー
データ構造); 例外を捕捉した関数におけるスタックフレーム上にある
オブジェクトへの参照 (sys.exc_traceback
に記憶されている
トレースバックが、スタックフレームを生き延びさせます);
または、対話モードでハンドルされなかった例外を送出した
スタックフレーム上にあるオブジェクトへの参照
(sys.last_traceback
に記憶されているトレースバックが、
スタックフレームを生き延びさせます);
最初の状況については、明示的に循環参照を壊すしか解決策は
ありません; 後者の二つの状況は、None
を
sys.exc_traceback
や sys.last_traceback
に
入れることで解決できます。ごみオブジェクトと化した循環参照は、
オプションの循環参照検出機構 (cycle detector) が有効にされて
いる場合 (これはデフォルトの設定です) には検出されますが、
検出された循環参照を消去するのは Python レベルで
__del__() メソッドが定義されていない場合だけです。
__del__() メソッドが循環参照検出機構でどのように
扱われるか、とりわけ garbage
値の記述に関しては、
gc モジュール の
ドキュメントを参照してください。
sys.stderr
に警告が出力されます。また、
(例えばプログラムの実行終了による) モジュールの削除に伴って
__del__() が呼び出される際には、__del__()
メソッドが参照している他のグローバル変数はすでに削除されている
かもしれません。この理由から、 __del__() メソッドでは
外部の不変関係を維持する上で絶対最低限必要なことだけをすべき
です。バージョン 1.5 からは、単一のアンダースコアで始まるような
グローバル変数は、他のグローバル変数が削除される前にモジュール
から削除されるように Python 側で保証しています; これらの
アンダースコア付きグローバル変数は、__del__() が呼び
出された際に、import されたモジュールがまだ残っているか確認
する上で役に立ちます。
self) |
self) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
x<y
は x.__lt__(y)
を呼び出します;
x<=y
は x.__le__(y)
を呼び出します;
x==y
は x.__eq__(y)
を呼び出します;
x!=y
および x<>y
は
x.__ne__(y)
を呼び出します;
x>y
は x.__gt__(y)
を呼び出します;
x>=y
は x.__ge__(y)
を呼び出します。
これらのメソッドは任意の値を返すことができますが、比較演算子が
ブール値のコンテキストで使われた場合、戻り値はブール値として
解釈可能でなければなりません。そうでない場合には TypeError
が送出されます。
慣習的には、 False
は偽値、 True
は真値として用いられ
ます。
比較演算子間には、暗黙的な論理関係はありません。すなわち、
x==y
が真である場合、暗黙のうちに
x!=y
が偽になるわけではありません。
従って、__eq__ を実装する際、演算子が期待通りに
動作するようにするために __ne__ も定義する必要があります。
これらのメソッドには、(左引数が演算をサポートしないが、右引数は サポートする場合に用いられるような) 鏡像となる (引数を入れ替えた) バージョンは存在しません; むしろ、__lt__() と __gt__() は互いに鏡像であり、__le__() と __ge__() 、および __eq__() と __ne__() はそれぞれ互いに鏡像です。
拡張比較メソッドの引数には型強制 (coerce) が起こりません。
与えられた引数ペアの間で演算が実装されていない場合、拡張比較
メソッドは NotImplemented
を返します。
self, other) |
self < other
である場合には負の値、
self == other
ならばゼロ、self > other
であれば
正の値を返さなければなりません。演算 __cmp__() 、__eq__()
および __ne__() がいずれも定義されていない場合、
クラスインスタンスはオブジェクトのアイデンティティ (``アドレス'')
で比較されます。自作の比較演算をサポートするオブジェクトや、
辞書のキーとして使えるオブジェクトを生成するには、
__hash__() に関する記述を参照してください。
(注意: __cmp__() が例外を伝播しないという制限は
Python 1.5 から除去されました。)
self, other) |
self) |
self) |
bool()
を実現するために呼び出され
ます; False
または True
か、等価な整数値
0
または 1
を返さなければなりません。
このメソッドが定義されていない場合、__len__() (下記参照)
が定義されていれば呼び出されます。__len__() と
__nonzero__() のどちらもクラスで定義されていない場合、
そのクラスのインスタンスはすべて真の値を持つものとみなされます。
self) |
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。