目录
类的方法可分为类方法,静态方法和实例方法;这样的分类可以让代码开发更加的简洁明了,观看代码更有层次感,方便日后的维护工作;
一个类对象的行为即是该类的方法,类中的方法一般格式如下:
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装饰器来声明:
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.实例方法
实例方法不需要在类中使用装饰器修饰,格式如下
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来修改实例状态,不能直接修改的类状态;