私が行っているいくつかのラボ実験の結果にはExperiment
というクラスを定義しました。アイデアは一種のデータベースを作成することでした。実験を追加すると、これは終了時にデータベースに保存され、起動時に再読み込みされます(クラスレジストリに追加されます)。既に存在する場合は新しいクラスを作成するのではなく、クラスインスタンスを返す
私のクラス定義は次のとおりです。
def checkhash(hashdat):
for exp in cl.Experiment:
if exp.hashdat == hashdat:
return exp
return False
だから、私は以前に追加した実験を追加する場合は、この:結果を含むファイルのハッシュをチェックする機能がある
class IterRegistry(type):
def __iter__(cls):
return iter(cls._registry)
class Experiment(metaclass=IterRegistry):
_registry = []
counter = 0
def __init__(self, name, pathprotocol, protocol_struct, pathresult, wallA, wallB, wallC):
hashdat = fn.hashfile(pathresult)
hashpro = fn.hashfile(pathprotocol)
chk = fn.checkhash(hashdat)
if chk:
raise RuntimeError("The same experiment has already been added")
self._registry.append(self)
self.name = name
[...]
fn.checkhash
ながら上書きされません。
エラーが発生するのではなく、既存のインスタンスが既に存在する場合は、何とか元のインスタンスに戻すことはできますか?
ありがとうございます。これは最善の解決策に見えますが、私は短い質問があります。私は常に '__new__ 'を上書きすることは良い方法ではないことを知っています。 "一般的には、str、int、unicode、tupleのような不変型をサブクラス化しない限り、' __new__'をオーバーライドする必要はありません。 '__new__'のすべての属性を初期化するのはいいですか? – David
@ david23:新しいインスタンスを求めるときに既存のインスタンスを返すことは一般的な使用例ではなく、 '__new__'のオーバーライドのための正しいインスタンスの1つです。もう1つは不変型です。 –