我想創建一個只創建一個實例的類,如果在實例化過程中傳入的參數是唯一的組合。如果先前傳入了參數組合,則返回先前已創建的實例。 我想讓這個類被其他類繼承,所以它們繼承了相同的行爲。這是我的一個解決方案,第一次嘗試,只實例化一個類的唯一對象
基/父類被繼承:
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
@aristotll我不確定這是可能的。我知道有些事情正在進行,因爲我檢查了在程序的不同點上爲所有類型創建了多少個對象,並且字典不斷增加 –