2013-06-27 11 views
7

まず、Pythonのクラスの__init__()関数が値を返すことができないので、悲しいことにこのオプションは利用できません。Python __init__作成に失敗しました

私のコードの構造上、クラスの__init__機能の中にデータアサーション(およびユーザーに情報を入力するよう促す)があるのが理にかなっています。しかし、これは、オブジェクトの作成が失敗する可能性があることを意味し、これから正常に回復できるようにしたいと考えています。

これを続ける最良の方法は何か不思議でした。私はグローバルなブール値を「有効な構築」フラグとして設定することを検討しましたが、そうしたくはありません。

他のアイデア(再構成のほか、アサーションは初期化の外側で実行され、値は引数として渡されます)?私は基本的に、成功時に0を返し、初期化中に失敗すると-1を返す方法を探しています。 (ほとんどのCシステムコールのように)

+8

例外を発生させます。 –

+1

成功すれば0を返し、失敗した場合は-1を返します。エラーを返すのは悪いです。なぜなら、それらは無視しやすく、扱い易いからです。さらに、ブール値として0と-1を使用すると、混乱が生じて利益が得られません。 Pythonを使ってCコードを書くのは真実ではありません。 – abarnert

+0

@jsbuenoは彼の答えを指摘しているので、クラスインスタンスは作成されていない '__init __()'の中で_初期化されています。そのため、値を '返す 'のではありません。グローバル変数を使用してこれを行うか、例外をスローするのではなく、クラスにデータメンバーを追加してその状態を示し、その値を直接チェックするか、 '__init __()'の後にその値を返すメソッドを呼び出します間違ったことが何か(もしかしたら何か)を判断するために呼び出されました。 – martineau

答えて

11

ASSERTIOのいずれかが失敗するときは、例外を発生させることができ、または - 、あなたが本当に望んでいないかの例外を除いて動作しないことができるならば、あなたは自分のクラスで__new__メソッドを書くことができます - Pythonで は、__init__は技術的です"初期化子"メソッド - 属性を記入し、ライフサイクル中にオブジェクトが必要とするリソースやその他のものを取得する必要があります - しかし、Pythonでは__init__の前に呼び出される__new__という実際のコンストラクタを定義しています。これとは異なり、__new__は実際に値を返します。新しく作成された(初期化されていない)インスタンス自体。

__new__の中に小切手を入れて、単に何も失敗した場合は返します。そうでない場合は、スーパークラス__new__メソッドの呼び出しの結果を返します(純粋なPythonでオブジェクトの実際のメモリ割り当てを行うことはできません)。ので、最終的にあなたはスーパークラスでネイティブコードで記述されたコンストラクタを呼び出す必要があります - 通常これはあなたのクラス階層のベースでobject.__new__ある

NB:Pythonの2では、あなたはのための基本クラスとしてobjectを持っている必要があります。あなたの階層 - そうでなければ__new__は呼び出されません。後でPythonオブジェクトに追加される多くの機能はうまく機能しません。つまり、 class MyClass(object):、決してclass MyClass: - Python3を使用している場合を除きます。

+0

'__new__'は' __init__'の前に呼び出されます。私はこれを試しましたが、クラスのインスタンスを作成するときに '__new__'は呼び出されません(Py2.7)。 –

+0

私はそれを見つけました。クラス内でオブジェクトを拡張する必要があります。それがなければ、新しいことは呼ばれません! –

+0

いいえ、オブジェクト基本クラスを省略すると、 '__new__'は自動的に呼び出されません。 Go figure! –

0

例外を発生させると考えましたか?これが障害を通知する通常の方法です。

関連する問題