2016-10-28 47 views
2

クラス・コンテキスト・マネージャを介してオブジェクトのインスタンス化を強制したい。したがって、直接インスタンス化することは不可能にしてください。Python Context Managerを使ってオブジェクトのインスタンスを強制する方法は?

私はこのソリューションを実装しましたが、技術的にはまだオブジェクトをインスタンス化できます。

class HessioFile: 
    """ 
    Represents a pyhessio file instance 
    """ 
    def __init__(self, filename=None, from_context_manager=False): 
     if not from_context_manager: 
      raise HessioError('HessioFile can be only use with context manager') 

とコンテキストマネージャ:

@contextmanager 
def open(filename): 
    """ 
    ... 
    """ 
    hessfile = HessioFile(filename, from_context_manager=True) 

任意のより良い解決策?

+0

クラスをインスタンス化しないようにする理由は何ですか? – Tryph

+0

その理由は、そのユーザが__init__で開いているファイルを閉じないようにするためです –

答えて

2

私が知っていることはありません。一般的に、Pythonに存在する場合、それを呼び出す方法を見つけることができます。コンテクストマネージャーは、本質的にはリソース管理スキームです。マネージャー以外のクラスにユースケースがない場合、おそらくコンテクスト管理をクラスのメソッドに組み込むことができますか?私は標準ライブラリからatexitモジュールをチェックアウトすることをお勧めします。コンテキストマネージャがクリーンアップを処理するのと同じ方法でクリーンアップ関数を登録することができますが、各インスタンス化に登録されたクリーンアップ関数があるようにクラスにバンドルすることができます。役立つかもしれません。

あなたのコードで人々が愚かなことをするのに手間がかからないことは注目に値する。あなたのベスト・ベットは、一般的に、コードでスマートなことをできるだけ簡単にすることです。

0
あなたがを試してみて、(あなたのオブジェクトへの直接呼び出し、インスタンス上の他のアクションを許可する前に確認してください __enter__時に設定されているブール属性を禁止するために、コールスタックの検査のように)これを強制 にハック方法を考えることができます

が、最終的に他の人に理解して説明することができなくなる。

あなたが望むならば、人々は常にそれをバイパスする方法を見つけられることを確かめるべきです。 Pythonは本当にあなたの手を引っ張りません。あなたが何かばかげたことをしたいのであれば、それを可能にします。責任ある大人、そう?

執行が必要な場合は、ドキュメントの通知として提供する方がよいでしょう。この方法で、ユーザーが直接インスタンス化して不要な動作をトリガーする場合は、コードのガイドラインに従わないことが原因です。

関連する問題