Существует разница:
return self.__total = sum(item.total() for item in self.cart)
будет перезаписывать любое предыдущее значение закрытой переменной total , тогда как
if not hasattr(self, '__total'):
self.__total = sum(item.total() for item in self.cart)
return self.__total
вернет предыдущее значение, если оно было присвоено ранее ...