J'essaie de créer une classe qui ne recréera pas un objet avec les mêmes paramètres d'entrée. Lorsque j'essaie d'instancier une classe avec les mêmes paramètres que ceux utilisés pour créer un objet déjà existant, je veux juste que ma nouvelle classe retourne un pointeur vers l'objet déjà créé (créé de manière coûteuse). Voilà ce que je l'ai essayé jusqu'à présent:Comment créer une classe qui ne recrée pas un objet avec des paramètres d'entrée identiques
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'
Ceci est ma première incursion dans __new__
primordiale et je suis convaincu que je ne vais pas parler de la bonne façon. Réglez-moi directement, s'il vous plaît.
C'est exactement la meilleure façon de le faire. Parfaitement suggéré. – mpeterson
L'utilisation de '__new__' serait en effet la façon/pythonique de le faire plutôt que d'introduire une autre classe - votre solution est Java idiomatique. N'insérez pas d'espaces entre parenthèses et n'utilisez pas les noms de méthode camelCase dans Python. –