class Cls:
def __init__(self):
self.var = "instance" # shadows class variable `var`
def instance_method(self):
print(self.var)
var = "class"
@classmethod
def class_method(cls):
print(cls.var, cls().var, sep=", ")
@staticmethod
def static_method():
print("static")
# prints
print(Cls().var) # "instance"
Cls().instance_method() # "instance"
print(Cls.var) # "class"
Cls().class_method() # "class, instance"
Cls.static_method() # "static"
Cls().static_method() # "static"
There’s no decorator for instance method as, by default, a method in class is instance method
self is normally preferred convention to refer current instance
decorator is @classmethod
cls is normally preferred convention to refer current class
In Line var = "class” , var is a class variable, so it can be accessed directly by class object
also cls is a callable, and here cls() is equivalent to Cls()
when it comes to first argument given to method i.e.,
selforcls, variable’s name doesn’t matter, it can be anything other thanselforcls
decorator is @staticmethod
this is pretty straight forward, they’re static
neither related to class nor instance, so no reference variable like self or cls
it can be called through class or instance