Very similar to techniques used in Knowledge Based Engineering systems, where the term "dependency tracking" is used. Together with caching of nodes/tensors this reduces calculations, especially useful for large parametric 3D models.
When getting a value it will recursively call the binary/dependency tree to find out which variables have changed and only recalculate them when needed. Custom python objects and properties with __set__ and __get__ methods makes this a built-in feature of an object-oriented model.
x = Tensor(3)
y = Tensor(5)
z = x + y
print(x, y) # 3, 5
print(z) # 8
x.value = 4 # when setting value nothing is recalculated
print(z) # 9 since getting value triggers recalculation of dependencies that have changed