1、区分
Python类包含三种方法:实例方法、静态方法和类方法。参考了该教程。
实例方法:要想调用实例方法,必须要实例化类,然后才可以调用。也就是说,调用实例化方法需要类的实例(对象)。
静态方法:静态方法在调用时不需要类的实例(静态方法不需要self参数),定义静态方法需要@staticmethod装饰器(decorator)。当这个类中所有对象都具有该方法时,常用静态方法。
类方法:类方法的调用方式与静态方法一样,但是类方法却与实例方法的定义相同,都需要类似于self的参数(类方法中常用cls)。只不过这个self参数的含义不同。对于实例方法来说,这个self参数就代表当前类的实例,可以通过self访问对象中的方法和属性。而类方法的self参数表示类的元数据,也就是类本身,不能通过self参数访问对象中的方法和属性,只能通过这个self参数访问类的静态方法和静态属性。
2、代码实例
class Stu:
school = '遂平一中' # 类属性
def __init__(self, name, age):
self.name = name
self.age = age
def play_basketball(self):
print("{name}正在打篮球".format(name=self.name))
# 类方法
@classmethod
def sport(cls):
print("{school}的同学都喜欢篮球".format(school=cls.school))
# 静态方法
@staticmethod
def clean():
print("打扫教室卫生")
注意:区分类属性,实例属性,类方法和实例方法的修改和添加。通过实例访问属性时,类会优先判断这个实例中包括不包括这个属性,如果实例属性中有这个属性,则优先返回实例属性对应的值,如果不包括,就接着找类属性中是否包含这个属性,如果实例属性中没有而类属性中有,则会返回类属性。
总结:
设计理念:在面向对象的设计理念中,方法必定属于某个类,如果这个方法不属于某个类,那么它就是函数了,就回归到了面向过程编程。方法属于某个类,但这个方法可能不会访问实例和类的任何属性或其他方法,对于这种方法,我们就应该把它设计成静态方法。