【发布时间】:2018-01-12 16:44:45
【问题描述】:
我正在尝试创建一个仅在实例化期间传入的参数是唯一组合时才创建实例的类。如果先前已传入参数组合,则返回先前已创建的实例。 我希望这个类被其他类继承,以便它们继承相同的行为。这是我第一次尝试解决方案,
要继承的基类/父类:
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
这就是它在子类中的使用方式:
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
我已经使用此设置运行了程序,但似乎每次创建 ProductAdGroup() 时都会创建一个新的字典,因此内存正在爆炸......即使程序返回了之前已经存在的实例实例化。
有没有办法解决这个问题? 谢谢!!!
【问题讨论】:
-
> 每次创建 ProductAdGroup() 时都会创建一个新字典。你怎么知道的?
-
@aristotll 我不确定是不是,但也许吧。我知道 dicts 发生了一些事情,因为我检查了在程序的不同点为所有类型创建了多少对象,并且 dicts 不断增加
标签: oop memory-leaks python-3.5 instantiation metaclass