Я работаю с кодом Python, который вызывает в C оболочки, но код C содержит очень ошибку (и у меня нет другой альтернативы) и вызывает segfault, когда Python объект, управляемый в C, выходит из области видимости, поэтому я должен сохранять ссылки на каждый созданный объект.
Есть ли хороший способ сделать эргономическую c "уникальную" оболочку, в которой каждый класс может только иметь один экземпляр для каждого набора аргументов конструктора, например,
@unique
class Test:
cls_val = 0
def __init__(self, val):
self.val = val
a = Test(1)
b = Test(1)
assert a is b
c = Test(2)
d = Test(2)
assert c is not b and c is not a
assert c is d
Я создал этот декоратор, но он предотвращает использование любого класса с уникальным декором в качестве базового класса (создание экземпляра производного класса вызывает __new__
декоратора).
def unique(unique_cls):
class Unique:
instances = {}
unique_class = unique_cls
def __new__(cls, *args, **kwargs):
if not Unique.instances.get(
(
cls.unique_class,
f_args := frozenset(args),
f_kwargs := frozenset(kwargs),
)
):
Unique.instances[
(Unique.unique_class, f_args, f_kwargs)
] = Unique.unique_class(*args, **kwargs)
return Unique.instances[(Unique.unique_class, f_args, f_kwargs)]
def __getattr__(self, name):
# Overloaded to get class attributes working for decorated classes
return object.__getattribute__(Unique.unique_class, name)
return Unique