Próbuję utworzyć klasę, która tworzy tylko instancję, jeśli argumenty przekazane podczas tworzenia wystąpień są unikalną kombinacją. Jeśli kombinacja argumentów została wcześniej przekazana, zwróć instancję, która została wcześniej utworzona. Chciałbym, aby ta klasa była dziedziczona przez inne klasy, więc dziedziczą to samo zachowanie. Jest to moja pierwsza próba rozwiązania,Wywoływanie tylko unikatowych obiektów klasy
Klasa bazowa/rodzic być dziedziczone:
class RegistryType(type):
def __init__(cls, name, bases, namespace, *args):
cls.instantiated_objects = {}
class AdwordsObject(object, metaclass=RegistryType):
api = AdWordsAPI()
def __new__(cls, *args):
object_name = '-'.join(args)
if object_name in cls.instantiated_objects:
return cls.instantiated_objects[object_name]
else:
obj = super(AdwordsObject, cls).__new__(cls)
cls.instantiated_objects[object_name] = obj
# cls.newt_connection.commit()
return obj
I tak to jest używane w klasie dziecko:
class ProductAdGroup(AdwordsObject):
# init method only called if object being instantiated hasn't already been instantiated
def __init__(self, product_name, keyword_group):
self.name = '-'.join([product_name, keyword_group])
@classmethod
def from_string(cls, name: str):
arguments = name.split('-')
assert len(arguments) == 2, 'Incorrect ad group name convention. ' \
'Use: Product-KeywordGroup'
ad_group = cls(*arguments)
return ad_group
I ve uruchomił program z tą konfiguracją, ale wydaje się, że za każdym razem, gdy tworzona jest grupa ProductAdGroup(), tworzony jest nowy dict, aby pamięć eksplodowała ... nawet jeśli program zwraca instancję, która została wcześniej utworzona.
Czy mimo to można to naprawić? Dzięki!
> Nowy dict jest tworzony za każdym razem, gdy tworzona jest grupa ProductAdGroup(). Skąd wiesz ? – aristotll
@aristotll Nie jestem pewien, czy tak jest, ale może. Wiem, że coś dzieje się z dyktami, ponieważ sprawdziłem, ile obiektów jest tworzonych dla wszystkich typów w różnych punktach programu, a dykcje stale rosną –