Sadece örnekleme sırasında iletilen argümanların benzersiz bir kombinasyon olması durumunda bir örnek oluşturan bir sınıf oluşturmaya çalışıyorum. Bağımsız değişkenlerin birleşimi önceden iletilmişse, daha önce oluşturulmuş örneği döndürün. Bu sınıfın diğer sınıflar tarafından miras alınmasını istiyorum, böylece aynı davranışı devralırlar. BuYalnızca bir sınıfın benzersiz nesneleri Instantiate
baz/üst sınıf devralınacak bir çözüm benim ilk denemem olduğu:
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
Ve bu çocuğun sınıfta kullanılıyor hesaplanır: Ben
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
programı bu kurulumla çalıştırdı, ancak her zaman ProductAdGroup() oluşturulduğunda her defasında yeni bir dict yaratılıyormuş gibi görünüyor, böylece program daha önce başlatılmış olan örneği döndürse bile bellek patlıyor.
Bunu düzeltmek için yine var mı? Teşekkürler !!!
> ProductAdGroup() her oluşturulduğunda yeni bir dict oluşturuluyor. Nereden biliyorsunuz ? – aristotll
@aristotll Bunun olduğundan emin değilim belki ama. Dicts ile bir şeyler olduğunu biliyorum çünkü programda farklı noktalarda her tür için kaç tane nesne yaratıldığımı kontrol ettim ve diktiler sürekli artıyor –