Spam.numInstances = Spam.numInstances + 1 # count how many instances created
print("New Spam instance created")
if Spam.numInstances == 2:
print("You have created two instance of Spam")
def printNumInstances(): # class method
print("Number of instances created: %s"% Spam.numInstances)
obj_1 = Spam()
obj_2 = Spam()
obj_3 = Spam()
# 1. Call of class method
Spam.printNumInstances()
# 2. Access of class variable from outside
Spam.numInstances = 5
# 3. Check if outside access has changed class variable's value
Spam.printNumInstances()
print("Number of instances created: %s" % Spam.numInstances)
# 4. Access of class variable through instance
print("numInstances's value in obj_1:%s" % obj_1.numInstances)
# Access with instance and a copy(reference) of class varialbe are generated as the instance's instance variable
obj_1.numInstances = 10
# Now obj_1's instance has become its independent instance, and has nothing to do with Spam.numInstances, this is like the following process:
# obj_1.numInstances = Spam.numInstances // When you access obj_1.numInstances, you are actually access the same object that Spam.numInstances pointed to (obj_1.numInstances also point to this object)
# obj_1.numInstances = 10 // And now obj_1.numInstances point to another object "10", and has nothing to do with "Spam.numInstances" from now on
print("numInstances's value in obj_1: %s" % obj_1.numInstances)
print("numInstances's value in obj_2:%s" % obj_2.numInstances)
# At this time, obj_2's numInstance is still a reference of Spam.numInstances
obj_2.numInstances = 20
# Now obj_2's instance has become its independent instance, and has nothing to do with Spam.numInstances
print("numInstances's value in obj_2: %s" % obj_2.numInstances)
print("numInstances's value in Spam:%s" % Spam.numInstances)