一、类中方法的定义
1:实例方法:第一个参数必须是self,默认是绑定到对象的,归属于实例对象。
2:类方法:使用修饰符@classmethod定义,且第一个参数必须是cls,方法被绑定到了类,归属于类对象。
3:静态方法:使用修饰符@staticmethod定义,参数随意,没有self和cls,不和任何对象绑定,不属于任何对象。
class Func:
def instance_func(self):
print("这是实例方法")
@classmethod
def class_func(cls):
print("这是类方法")
@staticmethod
def static_func():
print("这是静态方法")
func = Func()
func.instance_func() # 实例对象可以调用实例方法
func.class_func() # 实例对象可以调用类方法
func.static_func() # 实例对象可以调用静态方法
Func.instance_func() # 报错,类对象不可以调用实例方法,实例方法只能由实例对象调用
Func.class_func() # 类对象可以调用类方法
Func.static_func() # 类对象可以调用静态方法
二、调用
实例方法:实例对象可以调用,会自动将实例对象当做第一个参数传给self,类不可以调用实例方法,调用后会报错。
类方法:实例对象和类都可以调用,类调用会自动将类对象当做第一个参数传给cls,实例对象调用的类方法,也是自动将类当做第一个参数传给cls。
静态方法:实例对象和类都可以调用,就是一个普通的函数,没有自动传值一说。无法访问类属性、实例属性,相当于一个独立的方法,跟类没啥关系,放在一个类的作用域里面的函数而已。
三、类方法的使用场景
类方法适用于方法中只涉及到类变量的方法。
class Car:
max_speed = 100
@classmethod
def modify_speed(cls, speed):
cls.max_speed = speed
def __init__(self, brand, age):
self.brand = brand
self.age = age
@staticmethod
def print_message():
# 语法错误,不可以在静态方法中使用实例属性和类属性
print(f'这是{self.brand},车速是{cls.max_speed}')
print('这是辆汽车')
car1 = Car('宝马', 3)
car2 = Car('奥迪', 2)
print(car1.max_speed) # 100
print(car2.max_speed) # 100
Car.modify_speed(150)
print(car1.max_speed) # 150
print(car2.max_speed) # 150
总结三种方法的使用:若类中需要一个功能,该功能的实现代码中需要引用实例属性则将其定义成实例方法、需要引用类则将其定义成类方法、无需引用类或对象则将其定义成静态方法。