Ich habe ein paar Klassen, die Folgendes tun müssen:
Wenn der Konstruktor aufgerufen wird, und ein gleiches Objekt (aka ein Objekt mit der gleichen ID) bereits existiert, gib dieses Objekt zurück. Andernfalls erstelle eine neue Instanz. Im Grunde genommen,
>>> cls(id=1) ist cls(id=1)
True
Um dies zu erreichen, habe ich einen Klassendekorierer wie folgt geschrieben:
class Singleton(object):
def __init__(self, cls):
self.__dict__.update({'instances': {},
'cls': cls})
def __call__(self, id, *args, **kwargs):
try:
return self.instances[id]
except KeyError:
instance= self.cls(id, *args, **kwargs)
self.instances[id]= instance
return instance
def __getattr__(self, attr):
return getattr(self.cls, attr)
def __setattr__(self, attr, value):
setattr(self.cls, attr, value)
Dies tut, was ich möchte, aber:
@Singleton
class c(object):
def __init__(self, id):
self.id= id
o= c(1)
isinstance(o, c) # gibt False zurück
Wie kann ich das beheben? Ich habe eine verwandte Frage gefunden, aber ich kann diese Lösungen einfach nicht auf meinen Anwendungsfall anpassen.
Ich weiß, dass jemand mich bitten wird, etwas Code zu posten, der nicht funktioniert, also hier hast du:
def Singleton(cls):
instances= {}
class single(cls):
def __new__(self, id, *args, **kwargs):
try:
return instances[id]
except KeyError:
instance= cls(id, *args, **kwargs)
instances[id]= instance
return instance
return single
# problem: isinstance(c(1), c) -> False
def Singleton(cls):
instances= {}
def call(id, *args, **kwargs):
try:
return instances[id]
except KeyError:
instance= cls(id, *args, **kwargs)
instances[id]= instance
return instance
return call
# problem: isinstance(c(1), c) -> TypeError