14

__init__()まず、Python のクラスの関数は値を返せないことを知っているので、残念ながらこのオプションは利用できません。

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

これを継続する最善の方法は何だろうと考えていました。グローバルブール値を「有効な構築」フラグとして設定することを検討しましたが、そうしないことを好みます。

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

4

3 に答える 3

17

アサーションが失敗したときに例外を発生させることができます。または、本当に例外を処理したくない、または処理できない場合は __new__、クラスにメソッドを記述することができます。Python では、__init__技術的には「初期化」メソッドです。属性を入力し、オブジェクトがそのライフサイクル中に必要とするリソースやその他のリソースを取得する必要があります - ただし、Python は実際のコンストラクター、つまり__new__事前に呼び出されるメソッドを定義しますが、これ__init__とは異なり、__new__実際には値を返します。新しく作成された (初期化されていない) インスタンス自体。

したがって、チェックを内部__new__に配置し、Noneを返すだけで何かが失敗する可能性があります-そうでない場合は、スーパークラス__new__メソッドへの呼び出しの結果を返します(純粋なPythonではオブジェクトの実際のメモリ割り当てを行うことができないため、最終的にはスーパークラスのネイティブ コードで記述されたコンストラクターを呼び出します。通常、これはobject.__new__クラス階層のベースにあります。

NBobject : Python 2 では、階層の基本クラスとして持つ必要があります。そうしない__new__と、呼び出されないだけでなく、後で Python オブジェクトに追加された多くの機能が機能しなくなります。要するに、class MyClass(object):絶対にclass MyClass:- Python3 を使用していない限り。

于 2013-06-27T01:13:43.560 に答える
2

例外を発生させることを検討しましたか? これは、失敗を通知する通常の方法です。

于 2013-06-27T01:07:07.957 に答える