Tôi đang cố tạo một lớp chỉ tạo một cá thể nếu các đối số được truyền vào trong quá trình khởi tạo là một kết hợp duy nhất. Nếu sự kết hợp của các đối số đã được truyền vào trước đó, thì trả về cá thể đã được tạo trước đó. Tôi muốn lớp này được thừa kế bởi các lớp khác để chúng kế thừa cùng một hành vi. Đây là nỗ lực của tôi đầu tiên tại một giải pháp,Chỉ khởi tạo các đối tượng duy nhất của một lớp
Các lớp cơ sở/mẹ để được thừa hưởng:
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
Và đây là cách nó đang được sử dụng trong lớp trẻ:
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
tôi đã chạy chương trình với thiết lập này nhưng có vẻ như một dict mới đang được tạo ra mỗi khi ProductAdGroup() đang được tạo ra để bộ nhớ bùng nổ ... mặc dù chương trình trả về cá thể đã được khởi tạo trước đó.
Có cách nào để sửa lỗi này không? Cảm ơn !!!
> một dict mới được tạo ra mỗi khi ProductAdGroup() đang được tạo. Làm sao bạn biết ? – aristotll
@aristotll Tôi không chắc là nó có thể. Tôi biết có điều gì đó đang diễn ra với các dicts bởi vì tôi đã kiểm tra xem có bao nhiêu đối tượng được tạo ra cho tất cả các loại tại các điểm khác nhau trong chương trình và các dicts liên tục tăng –