第15课 python 静态方法(Static Method)、类方法(Class Method)、实例方法(Instance Method)
在Python类中,静态方法、类方法和实例方法有着不同的特点与用途,以下为你详细介绍:
实例方法(Instance Method)
实例方法是类中最常见的方法类型,第一个参数通常命名为
self
(当然也可以用其他符合Python命名规范的名称,但习惯用self
),这个self
代表的是类的实例对象本身。通过实例对象去调用该方法时,Python会自动将实例对象作为第一个参数传入。例如:class MyClass:
def instance_method(self):
print(f"这是一个实例方法,调用它的实例对象是 {
self}")
需要先创建类的实例,然后通过实例来调用实例方法,如下:
obj = MyClass()
obj.instance_method()
主要用于操作实例对象的属性、实现与实例相关的特定行为,不同的实例调用同一个实例方法时,由于各自实例属性值不同等原因,方法执行结果往往不同,比如在一个
Person
类中,instance_method
可以用于获取某个人实例的年龄、姓名等具体信息。类方法(Class Method)
类方法使用
@classmethod
装饰器来定义,按照惯例,第一个参数通常命名为cls
(同样也可换其他合法名称,但一般用cls
),这个cls
代表的是类本身,而不是类的实例。例如:class MyClass:
class_variable = 0
@classmethod
def class_method(cls):
print(f"这是一个类方法,当前类是 {
cls}")
既可以通过类名直接调用,也可以通过类的实例对象调用,不过通常建议通过类名调用,如下:
MyClass.class_method()
obj = MyClass()
obj.class_method()
常用于修改类的状态,比如修改类属性的值,或者创建基于类状态的新实例等情况。例如在一个
Student
类中,可以通过类方法来修改学生类总的人数统计属性,或者根据类中已有的一些默认设置来创建新的学生实例。静态方法(Static Method)
使用
@staticmethod
装饰器来定义静态方法,它不需要像实例方法那样有代表实例的self
参数,也不需要像类方法那样有代表类的cls
参数,它更像是一个普通的函数,只是被放在类的命名空间内而已。例如:class MyClass:
@staticmethod
def static_method():
print("这是一个静态方法")
同样既可以通过类名调用,也可以通过实例对象调用,不过通常也是更倾向于用类名调用,如下:
MyClass.static_method()
obj = MyClass()
obj.static_method()
静态方法一般用于实现一些与类的实例或者类的状态关联性不大,但逻辑上又适合放在类这个命名空间内的功能,比如一些工具性的函数,像在一个
MathUtils
类里,可以有静态方法用于判断一个数是否是质数,或者计算两个数的最大公约数等,这些操作不依赖于具体的实例或者类的属性变化。总的来说,实例方法侧重于操作实例相关内容,类方法主要围绕类本身的操作和状态改变,静态方法则提供类内相对独立的工具性或功能性逻辑。
以下是 10 个案例,帮助你学习 Python 类中的静态方法、类方法和实例方法:
案例一:学生信息管理
class Student:
school_name = "ABC School"
def __init__(self, name, age):
self.name = name
self.age = age
def get_student_info(self):
# 实例方法,访问实例属性
return f"学生姓名:{
self.name},年龄:{
self.age}"
@classmethod
def change_school_name(cls, new_name):
# 类方法,修改类属性
cls.school_name = new_name
@staticmethod
def is_adult(age):
# 静态方法,判断是否成年
return age >= 18
student1 = Student("小明", 16)
print(student1.get_student_info())
Student.change_school_name("XYZ School")
print(Student.school_name)
print(Student.is_adult(20))
在这个案例中,get_student_info
是实例方法,通过实例对象调用获取学生具体信息;change_school_name
是类方法,用于修改类级别的属性;is_adult
是静态方法,可根据传入年龄判断是否成年,无需实例或类的特定状态。
案例二:图形类
class Shape:
@staticmethod
def calculate_area(length, width
作者:结伴同行~