类方法、实例方法和静态方法

类方法、实例方法和静态方法的区别。

创建一个 Student 类,用于管理学生的信息和计算成绩相关的数据。

class Student:
    # 类属性,记录学生的总数
    total_students = 0

    def __init__(self, name, score):
        # 实例属性,学生的姓名
        self.name = name
        # 实例属性,学生的成绩
        self.score = score
        # 每创建一个学生实例,学生总数加 1
        Student.total_students += 1

    # 实例方法:用于获取学生的个人信息
    def get_info(self):
        return f"学生姓名: {self.name}, 成绩: {self.score}"

    # 类方法:用于获取学生的总数
    @classmethod
    def get_total_students(cls):
        return cls.total_students

    # 静态方法:用于计算平均成绩
    @staticmethod
    def calculate_average(scores):
        if not scores:
            return 0
        return sum(scores) / len(scores)


# 创建学生实例
student1 = Student("Alice", 85)
student2 = Student("Bob", 90)

# 调用实例方法
print(student1.get_info())
# 输出:学生姓名: Alice, 成绩: 85

# 调用类方法
print(Student.get_total_students())
# 输出:2

# 调用静态方法
scores = [student1.score, student2.score]
print(Student.calculate_average(scores))
# 输出:87.5

区别分析

1. 实例方法

  • 定义特点:在类中定义的普通方法,第一个参数通常是 selfself 代表类的实例对象。
  • 访问权限:可以访问和修改实例属性以及类属性。在上述例子中,get_info 方法通过 self.nameself.score 访问了实例的属性。
  • 调用方式:必须通过类的实例来调用。例如,student1.get_info() 是通过 student1 这个实例来调用 get_info 方法的。

2. 类方法

  • 定义特点:使用 @classmethod 装饰器进行修饰,第一个参数通常是 clscls 代表类本身。
  • 访问权限:可以访问和修改类属性,但不能直接访问实例属性。在上述例子中,get_total_students 方法通过 cls.total_students 访问了类属性。
  • 调用方式:既可以通过类名调用,也可以通过实例调用。例如,Student.get_total_students() 是通过类名调用的,也可以使用 student1.get_total_students() 这种实例调用的方式。

3. 静态方法

  • 定义特点:使用 @staticmethod 装饰器进行修饰,没有类似 selfcls 这样的特殊参数。
  • 访问权限:不能直接访问类属性和实例属性,它就像一个独立的函数,只是逻辑上与类相关。在上述例子中,calculate_average 方法只接收传入的成绩列表进行计算,不依赖于类或实例的属性。
  • 调用方式:既可以通过类名调用,也可以通过实例调用。例如,Student.calculate_average(scores) 是通过类名调用的,也可以使用 student1.calculate_average(scores) 这种实例调用的方式。
posted @ 2025-04-21 21:09  Budcs  阅读(40)  评论(0)    收藏  举报