class A:
def __init__(self, s):
self.s = s
def __eq__(self, other):
return self.s == other.s
print(A("string") == A("string")) # True
print(A("string") is A("string")) # False
class B(A):
pool = {} # вообще это должен быть WeakValueDictionary,
# иначе пул будет препятствовать уничтожению объектов GC
def __new__(cls, s):
existing = B.pool.get(s, None)
if existing: return existing
result = super().__new__(cls)
B.pool[s] = result
return result
print(B("string") == B("string")) # True
print(B("string") is B("string")) # True
Y2xhc3MgQToKCWRlZiBfX2luaXRfXyhzZWxmLCBzKToKCQlzZWxmLnMgPSBzCglkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKCQlyZXR1cm4gc2VsZi5zID09IG90aGVyLnMKcHJpbnQoQSgic3RyaW5nIikgPT0gQSgic3RyaW5nIikpICMgVHJ1ZQpwcmludChBKCJzdHJpbmciKSBpcyBBKCJzdHJpbmciKSkgIyBGYWxzZQoKY2xhc3MgQihBKToKCXBvb2wgPSB7fSAjINCy0L7QvtCx0YnQtSDRjdGC0L4g0LTQvtC70LbQtdC9INCx0YvRgtGMIFdlYWtWYWx1ZURpY3Rpb25hcnksCgkgICAgICAgICAgIyDQuNC90LDRh9C1INC/0YPQuyDQsdGD0LTQtdGCINC/0YDQtdC/0Y/RgtGB0YLQstC+0LLQsNGC0Ywg0YPQvdC40YfRgtC+0LbQtdC90LjRjiDQvtCx0YrQtdC60YLQvtCyIEdDCglkZWYgX19uZXdfXyhjbHMsIHMpOgoJCWV4aXN0aW5nID0gQi5wb29sLmdldChzLCBOb25lKQoJCWlmIGV4aXN0aW5nOiByZXR1cm4gZXhpc3RpbmcKCQlyZXN1bHQgPSBzdXBlcigpLl9fbmV3X18oY2xzKQoJCUIucG9vbFtzXSA9IHJlc3VsdAoJCXJldHVybiByZXN1bHQKcHJpbnQoQigic3RyaW5nIikgPT0gQigic3RyaW5nIikpICMgVHJ1ZQpwcmludChCKCJzdHJpbmciKSBpcyBCKCJzdHJpbmciKSkgIyBUcnVl