同じ入力パラメーターでオブジェクトを再作成しないクラスを作成しようとしています。既存のオブジェクトの作成に使用されたのと同じパラメーターでクラスをインスタンス化しようとすると、新しいクラスが既に作成された (高価に作成された) オブジェクトへのポインターを返すようにするだけです。これは私がこれまでに試したことです:
class myobject0(object):
# At first, I didn't realize that even already-instantiated
# objects had their __init__ called again
instances = {}
def __new__(cls,x):
if x not in cls.instances.keys():
cls.instances[x] = object.__new__(cls,x)
return cls.instances[x]
def __init__(self,x):
print 'doing something expensive'
class myobject1(object):
# I tried to override the existing object's __init__
# but it didnt work.
instances = {}
def __new__(cls,x):
if x not in cls.instances.keys():
cls.instances[x] = object.__new__(cls,x)
else:
cls.instances[x].__init__ = lambda x: None
return cls.instances[x]
def __init__(self,x):
print 'doing something expensive'
class myobject2(object):
# does what I want but is ugly
instances = {}
def __new__(cls,x):
if x not in cls.instances.keys():
cls.instances[x] = object.__new__(cls,x)
cls.instances[x]._is_new = 1
else:
cls.instances[x]._is_new = 0
return cls.instances[x]
def __init__(self,x):
if self._is_new:
print 'doing something expensive'
これはオーバーライドへの私の最初の冒険で__new__
あり、私はそれを正しい方法で行っていないと確信しています。私を正してください。