私が現在取り組んでいるプロジェクトの1つでは、クライアントによってインスタンス化できず、特定のインターフェースを介してのみインスタンスを提供できるクラスを作成することを考えていました。つまり、クライアントはそれ以上のインスタンスを作成できません。次のようなハッカー:
>>> try:
... raise WindowsError
... except:
... foo = sys.exc_info()
...
>>> foo
(<type 'exceptions.WindowsError'>, WindowsError(), <traceback object at 0x0000000005503A48>)
>>> type(foo[2])()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot create 'traceback' instances
彼がそれを持ったら。
インスタンス化できないクラスの作成に成功しました。すなわち
>>> class Foo():
... def __init__(self):
... raise TypeError("cannot create 'Foo' instances")
...
>>> bar = Foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
TypeError: cannot create 'Foo' instances
>>> bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'bar' is not defined
しかし、このすべての同じ定義を使用して、クラスのインスタンスを作成するにはどうすればよいでしょうか?
もちろん、私はこのようなことをすることができます:
>>> class Foo():
... def __init__(self, instantiate = False):
... if not instantiate:
... raise TypeError("cannot create 'Foo' instances")
しかし、私はそれが十分にエレガントだとは思いませんし、クライアントがそれをさらにインスタンス化するのを完全に妨げるわけでもありません。いいえ、私はそのための C++ モジュールを構築する道を進んでいません。
そのようなことを達成する方法について何か提案はありますか? import abc
?
Martijnの質問に答え、完全を期すための簡単な理由:
実際には、問題の特定の関連クラスのインスタンスをツリー内のノードと見なすことができ、親と子の両方が接続されたままになり、相互に依存し、認識し、すべてのオブジェクト全体で単一の一意のルートを持つことができます。 python のインスタンス (使用により保証されますpackage
)。特定のノードの状態が変化すると、それに応じて、他のノードが自分自身と接続先のデータベースを更新することになります。それとは別に、私はそのようなものをどのように配置できるか知りたいと思っていました (traceback
クラスは私をからかっていました)。