Please consider the following code
class A(object):
cache = {}
@classmethod
def instance_by_id(cls, id_):
cache = cls.cache
if id_ in cache:
print(f"id {id_} already in cache")
instance = cache.get(id_, A(id_))
cache[id_] = instance
def __init__(self, id_):
self._id = id_
print(f"creating instance for {id_}")
def main():
for n in [1, 1, 1, 1]:
instance = A.instance_by_id(n)
if __name__ == "__main__":
main()
Its output is
creating instance for 1
id 1 already in cache
creating instance for 1
id 1 already in cache
creating instance for 1
id 1 already in cache
creating instance for 1
I expected the output to be
creating instance for 1
id 1 already in cache
id 1 already in cache
id 1 already in cache
What's going on here?