Python: Understanding classmethod
0
17
The code I am providing is runnable, just run it in any python interpreter or IDLE and you will see how I mentioned step-by-step flow of program using print() statement.
# using built-in classmethod as decorator
# classmethod allows changes to class. This change can even be made by classreference and by object reference( Yeah, thnx to this method, it is possible)
class Student:
no_of_Leaves = 8
def __init__(self,naam,grad,umar):
self.name= naam
self.grade = grad
self.age = umar
def printDetails(self): # self refers to the object using it, i.e if harry calls this func self = harry
print(f"Name is {self.name} \nGrade is {self.grade} \nAge is {self.age}")
@classmethod # 1 . This line has the same function as "change = classmethod(change)" down there. so if you uncomment that one and comment this one
# it won't make any difference, but don't uncomment both or you will have to deal with an error
def change(cls,modifiedleaves):
cls.no_of_Leaves = modifiedleaves
# change = classmethod(change)
harry = Student("harry",10,21)
# let's see how class method works
print("checking initial value of leaves: ")# checking initial value of leaves
print("Value of leaves in Student:",Student.no_of_Leaves,"-------Harry leaves: ",harry.no_of_Leaves) # prints 8
print("\nlet's try changing it using class reference") # changing class variable value using class-reference "Student.no_of_leaves"
Student.no_of_Leaves = 10
print("\nafter changing it \nValue of leaves in Student:",Student.no_of_Leaves,"-------Harry leaves: ",harry.no_of_Leaves)
print("\nlet's try changing it using object(harry) reference")
harry.no_of_Leaves = 12
print("\nafter changing it \nValue of leaves in Student:",Student.no_of_Leaves,"-------Harry leaves: ",harry.no_of_Leaves)
print("\n See the difference? You can't change class variable value using object that's why a new instance variable was created for harry having leaves: 12")
print("___________________________________________________________________________________________________________________________________________________")
print("""\nNow, let's see the Power of classmethod, but first, let me delete that instance variable with no_of_leaves 12____ so that' we have a clear"
"understanding of what is happening""")
print("\nBefore deleting instance variable \nValue of leaves in Student:",Student.no_of_Leaves,"-------Harry leaves: ",harry.no_of_Leaves)
del harry.no_of_Leaves
print("\nAfter deleting instance variable \nValue of leaves in Student:",Student.no_of_Leaves,"-------Harry leaves: ",harry.no_of_Leaves)
print("See? Back to 10 and 10")
print("\nLet's Try changing it using classmethod while calling it using class \"Student\" " )
Student.change(12)
print("\nafter changing it \nValue of leaves in Student:",Student.no_of_Leaves,"-------Harry leaves: ",harry.no_of_Leaves)
print("\nLet's Try changing it using classmethod while calling it using object \"harry\" " )
harry.change((14))
print("\nafter changing it \nValue of leaves in Student:",Student.no_of_Leaves,"-------Harry leaves: ",harry.no_of_Leaves)
print("""\nSee the power of classmethod? Above, while directly trying to change it using object(harry) a new variable was created,
but now, it managed to modify the existing class variable so that's why class method is useful""")