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