0

複数の呼び出し元アプリケーションによってインポートおよび使用される Python クラスを作成しています。呼び出し元の各アプリは、起動時にクラスを 1 回 (そして 1 回だけ) インスタンス化し、アプリが閉じられるまでそのインスタンスを維持するように記述されます。

インスタンス化の成功には、依存関係とチェックのかなり長いリストが含まれます。たとえば、特定のフォルダーに特定の MS Access ファイルが存在すること、その DB を更新する機能、別のフォルダーにあるログ ファイルへの読み取り/書き込み特権を持つこと、呼び出し元のアプリに関連する特定の他のフォルダー...アイデアが得られます。私がやりたいことは、クラスのインスタンス化時にこれらすべての依存関係をチェックすることです。それらのいずれかが失敗した場合、クラス内のコードはユーザーにエラー ポップアップを提供し、クラスのインスタンス化を控えます。呼び出し元のアプリは、クラスがインスタンス化されていないことを検出し、単に終了します。

私は他のさまざまなスレッドに根ざしており、私が見つけたオプションは、Factory を作成するか (必要なものが誇張されているように見えます)、__new__メソッドをオーバーライドすることです (他の議論ではトリッキーになる可能性があります...ほとんどすべて私が見つけたコードサンプルには、それが機能しないすべての状況を警告するコメントの長い列がありました)。

では、推奨されるプラクティスの観点から、これらのいずれかが進むべき道でしょうか? または、私が達成しようとしていることに最適な他の選択肢はありますか?

4

1 に答える 1

2

標準的な方法は、クラスをインスタンス化するコードで例外を発生させ、その例外をキャッチして処理することです。

class MyClass(object):
    def __init__(self, foo, bar, baz):
        if not self._database_exists(foo):
            raise ValueError('No valid database {}'.format(foo))

        # etc.

それから:

try:
    theinstance = MyClass('foooption', barvalue, bazvalue)
except ValueError as e:
    # Oops, something went wrong
    showErrorToUser(e)
    theinstance = None
于 2013-03-13T15:58:57.263 に答える