Для этого есть два решения «программной инженерии», которые не требуют каких-либо низкоуровневых знаний Python.Они применяются в следующих сценариях:
Первый сценарий: Объекты вашего класса «равны», если они построены с одинаковыми параметрами конструктора, и равенство не изменится со временем после построения, Решение: Используйте фабрику, которая хэширует параметры конструктора:
class MyClass:
def __init__(self, someint, someotherint):
self.a = someint
self.b = someotherint
cachedict = { }
def construct_myobject(someint, someotherint):
if (someint, someotherint) not in cachedict:
cachedict[(someint, someotherint)] = MyClass(someint, someotherint)
return cachedict[(someint, someotherint)]
Этот подход по существу ограничивает экземпляры вашего класса одним уникальным объектом для каждой отдельной входной пары.Есть и очевидные недостатки: не все типы легко хешируются и т. Д.
Второй сценарий: Объекты вашего класса изменчивы, и их «равенство» может меняться со временем. Решение: определить реестр на уровне класса равных экземпляров:
class MyClass:
registry = { }
def __init__(self, someint, someotherint, third):
MyClass.registry[id(self)] = (someint, someotherint)
self.someint = someint
self.someotherint = someotherint
self.third = third
def __eq__(self, other):
return MyClass.registry[id(self)] == MyClass.registry[id(other)]
def update(self, someint, someotherint):
MyClass.registry[id(self)] = (someint, someotherint)
В этом примере объекты с одинаковой парой someint, someotherint
равны, тогда как третий параметр не учитываетХитрость заключается в том, чтобы синхронизировать параметры в registry
.В качестве альтернативы update
вы можете вместо этого переопределить getattr
и setattr
для своего класса;это обеспечит синхронизацию любого назначения foo.someint = y
с вашим словарем на уровне класса.Смотрите пример здесь .