質問: a() 出力:new init exists init exists init どうして?
回答: 今、私は同じ問題を抱えています、そしていくつかの理由で私はデコレータ、工場とメタクラスを避けることに決めました。私はこのようにしました:メインファイルdef _alt(func): import functools @functools.wraps(func) def init(self, *p, **k): if hasattr(self, "parent_initialized"): return else: self.parent_initialized = true func(self, *p, **k) return init class parent: # empty dictionary, shouldn't ever be filled with anything else parent_cache = {} def __new__(cls, n, *args, **kwargs): # checks if object with this id (n) has been created if n in cls.parent_cache: # it was, return it return cls.parent_cache[n] else: # check if it was modified by this function if not hasattr(cls, "parent_modified"): # add the attribute cls.parent_modified = true cls.parent_cache = {} # apply it cls.__init__ = _alt(cls.__init__) # get the instance obj = super().__new__(cls) # push it to cache cls.parent_cache[n] = obj # return it return obj クラス例class a(parent): def __init__(self, n): print("a.__init__", n) class b(parent): def __init__(self, n): print("b.__init__", n) 使用中で>>> a(1) a.__init__ 1 # first a(1) initialized <__main__.a object at 0x000001a73a4a2e48> >>> a(1) # returned previous a(1) <__main__.a object at 0x000001a73a4a2e48> >>> a(2) a.__init__ 2 # first a(2) initialized <__main__.a object at 0x000001a7395d9c88> >>> b(2) b.__init__ 2 # b class doesn't collide with a, thanks to separate cache <__main__.b object at 0x000001a73951b080> 警告:parentを初期化しないでください。will他のクラスと衝突します - それぞれの子で別々のキャッシュを定義しない限り、それは違います。私たちが欲しいもの。 警告:祖父母がおかしな振る舞いをするので、親を持つクラスのようです。 [未確認] オンラインで試す