동일한 입력 매개 변수를 사용하여 개체를 다시 만들지 않는 클래스를 만들려고합니다. 이미 존재하는 객체를 만드는 데 사용 된 것과 동일한 매개 변수를 사용하여 클래스를 인스턴스화하려고하면 새 클래스가 이미 작성된 객체 (비싼 값으로 생성 된 객체)에 대한 포인터를 반환하기 만하면됩니다. 이것은 내가 지금까지 시도한 것입니다 :동일한 입력 매개 변수를 사용하여 개체를 다시 만들지 않는 클래스를 만드는 방법
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__
에 처음으로 벤처와 내가 올바른 방법 그것에 대해 않을거야 확신 해요. 나를 똑바로 세워 줘.
정확하게 이것을 수행하는 가장 좋은 방법입니다. 완벽하게 제안. – mpeterson
'__new__'을 사용하면 실제로 다른 클래스를 도입하는 것과는 달리/그것을 수행하는 파이썬 적 방법이 될 것입니다. 해결책은 관용적 인 Java입니다. 또한 괄호 안에 공백을 넣지 말고 Python에서 camelCase 메서드 이름을 사용하지 마십시오. –