类的方法可分为类方法,静态方法和实例方法;这样的分类可以让代码开发更加的简洁明了,观看代码更有层次感,方便日后的维护工作;
一个类对象的行为即是该类的方法,类中的方法一般格式如下:
1class 类名(参数): 2 def 方法名(参数): 3 ...
1.类方法
类方法使用 @classmethod装饰器来声明:
1class 类名(参数): 2 3 @classmethod 4 def 方法名(cls,参数): 5 ...
- cls可以理解为class的缩写,表示调用整个类 ;
- 类方法不能直接修改实例属性;
- 类方法通常用来调整类属性,可通过 cls.类属性 的方式改变类属性;
- 推荐调用类方法的格式: 类名.方法名
1# 演示类方法 2class MyClass: 3 class_str = '我是类属性' 4 5 @classmethod 6 def class_method(cls): 7 cls.class_str = '我改了类属性' 8 9 10# 输出类属性 11print(MyClass.class_str) 12# 调用类方法 13MyClass.class_method() 14# 查看改变后的类属性 15print(MyClass.class_str)
2.静态方法
静态方法使用 @staticmethod装饰器来声明:
1class 类名(参数): 2 3 @staticmethod 4 def 方法名(): 5 ...
- 静态方法中不需要 cls(类)和self(实例) 与类和实例无关;
- 推荐调用静态方法的格式: 类名.方法名
1# 演示静态方法 2class MyClass: 3 class_str = '我是类属性' 4 5 def __init__(self): 6 self.instance_str = '我是实例属性' 7 8 @staticmethod 9 def static_method(): 10 print('我既不改变类属性,也不改变实例属性') 11 12 13# 创建实例 14my_instance = MyClass() 15# 输出类属性 16print(MyClass.class_str) 17# 输出实例属性 18print(my_instance.instance_str) 19# 调用静态方法 20MyClass.static_method() 21# 查看后续 22print(MyClass.class_str) 23print(my_instance.instance_str)
3.实例方法
实例方法不需要在类中使用装饰器修饰,格式如下
1class 类名(参数): 2 3 def 方法名(self,参数): 4 ...
- self可以理解成当前实例 ,哪个实例用来它,它就是哪个实例
- 实例方法不能直接修改类属性,
- 实例方法不能直接用 类名 调用,需要新建实例出来才能通过实例名调用;
- 推荐调用实例方法的格式: 实例名.方法名
1# 演示实例方法 2class MyClass: 3 class_str = '我是类属性' 4 5 def __init__(self): 6 self.instance_str = '我是实例属性' 7 8 def instance_method(self): 9 self.instance_str = '改了实例属性' 10 # 注意这里的class_str并不是类属性,而是和类属性重名的实例属性; 11 # 是通过实例方法新建出来的实例属性,要改变类属性用 类方法cls 12 self.class_str = '改了类属性?' 13 14 15# 创建实例 16my_instance = MyClass() 17# 输出类属性 18print(MyClass.class_str) 19# 输出实例属性 20print(my_instance.instance_str) 21print(my_instance.class_str) # 没有调用实例方法此时class_str指代类属性 22# 调用实例方法 23my_instance.instance_method() 24# MyClass.instance_method() # 错误使用 25print('-' * 31) 26# 输出类属性 27print(MyClass.class_str) 28# 输出实例属性 29print(my_instance.instance_str) 30print(my_instance.class_str) # 调用了实例方法后,此时已经新建出实例属性class_str
总结
- 类方法使用@classmethod,通过cls修改类的状态,不能直接修改实例的状态;
- 静态方法使用 @staticmethod 声明此方法不使用cls和self;
- 实例方法通过self来修改实例状态,不能直接修改的类状态;