Python语法基础学习笔记类的定义和使用
目录
【Python语法基础学习笔记】类的定义和使用
一、类和对象的基本概念
什么是类?
类(Class)是一种自定义的数据类型,可以理解为现实世界中某类事物的抽象模板。比如:
- 学生类(Student):代表所有学生的共同特征
- 教师类(Teacher):代表所有教师的共同特征
类就像一个蓝图,定义了这类事物会有哪些属性(特征)和方法(行为)。
什么是对象?
对象(Object)是类的具体实例,也可以理解为用类创建的 “变量”。比如:
- 用 Student 类创建出 “小明” 这个具体学生
- 用 Teacher 类创建出 “李老师” 这个具体教师
一个类可以创建出无数个对象,每个对象都具有类中定义的属性和方法。
二、类的创建与使用
1. 类的基本创建
# 定义一个学生类
class Student:
# 类的内容
pass # pass表示暂时不写内容
2. 构造函数
构造函数是创建对象时自动调用的特殊方法,用于初始化对象的属性。在 Python 中,构造函数的名字固定为__init__
。
class Student:
# 构造函数,self是必须的参数
def __init__(self, name, age):
# 初始化对象的属性
self.name = name # 姓名属性
self.age = age # 年龄属性
3. 实例化(创建对象)
使用类创建对象的过程叫做实例化。
# 用Student类创建对象(实例化)
student1 = Student("小明", 18) # 创建第一个学生对象
student2 = Student("小红", 17) # 创建第二个学生对象
这里的student1
和student2
就是 Student 类的对象。
4. 类的方法
方法是定义在类中的函数,用于描述对象的行为。
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
# 定义一个方法:介绍自己
def introduce(self):
print(f"大家好,我叫{self.name},今年{self.age}岁")
# 定义一个方法:学习
def study(self, subject):
print(f"{self.name}正在学习{subject}")
5. 关于 self 的说明
self
是类中方法的第一个参数,代表对象自身- 当对象调用方法时,Python 会自动把对象本身作为
self
参数传入 - 通过
self
可以访问对象的属性和其他方法 self
只是一个约定俗成的名字,也可以用其他名字,但建议始终使用self
三、属性和方法的分类
1. 实例属性
- 属于具体对象的属性,每个对象的实例属性可以有不同的值
- 定义在
__init__
方法中,用self.属性名
表示 - 通过对象名访问:
对象名.属性名
class Student:
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age # 实例属性
# 使用实例属性
student1 = Student("小明", 18)
print(student1.name) # 输出:小明
student1.age = 19 # 修改实例属性
2. 类属性
- 属于类本身的属性,所有对象共享同一个类属性
- 定义在类中,方法外
- 通过类名或对象名访问:
类名.属性名
或对象名.属性名
class Student:
# 类属性:所有学生都属于同一个学校
school = "阳光中学"
def __init__(self, name, age):
self.name = name
self.age = age
# 使用类属性
print(Student.school) # 输出:阳光中学
student1 = Student("小明", 18)
student2 = Student("小红", 17)
print(student1.school) # 输出:阳光中学
print(student2.school) # 输出:阳光中学
# 修改类属性(会影响所有对象)
Student.school = "希望中学"
print(student1.school) # 输出:希望中学
3. 实例方法
- 属于具体对象的方法,需要通过对象调用
- 第一个参数必须是
self
,代表调用该方法的对象 - 可以访问和修改实例属性和类属性
class Student:
school = "阳光中学"
def __init__(self, name, age):
self.name = name
self.age = age
# 实例方法
def get_info(self):
return f"姓名:{self.name},年龄:{self.age},学校:{self.school}"
student1 = Student("小明", 18)
print(student1.get_info()) # 调用实例方法
4. 类方法
- 属于类的方法,需要用
@classmethod
装饰器标识 - 第一个参数是
cls
,代表类本身 - 只可以访问和修改类属性,不能直接访问实例属性
- 通过类名或对象名调用
class Student:
school = "阳光中学"
def __init__(self, name, age):
self.name = name
self.age = age
# 类方法
@classmethod
def change_school(cls, new_school):
cls.school = new_school # 修改类属性
# 调用类方法
Student.change_school("希望中学")
print(Student.school) # 输出:希望中学
5. 魔术方法(特殊方法,竞赛不需要掌握)
魔术方法是 Python 中具有特殊功能的方法,以双下划线__
开头和结尾。常用的魔术方法:
__init__
:构造函数,创建对象时调用__str__
:返回对象的字符串表示,使用print()
打印对象时调用__len__
:返回对象的长度,使用len()
函数时调用__del__
:析构函数,对象被销毁时调用
class Student:
def __init__(self, name, courses):
self.name = name
self.courses = courses # 课程列表
# 自定义打印对象时的输出
def __str__(self):
return f"学生:{self.name}"
# 自定义len()函数的返回值
def __len__(self):
return len(self.courses) # 返回课程数量
student1 = Student("小明", ["数学", "语文", "英语"])
print(student1) # 输出:学生:小明(调用了__str__方法)
print(len(student1)) # 输出:3(调用了__len__方法)
四、综合示例
# 定义一个完整的学生类
class Student:
# 类属性
total_students = 0 # 学生总数
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
self.grades = {} # 存储成绩的字典
# 每创建一个学生,总数加1
Student.total_students += 1
# 实例方法:添加成绩
def add_grade(self, subject, grade):
self.grades[subject] = grade
# 实例方法:计算平均成绩
def get_average(self):
if not self.grades:
return 0
return sum(self.grades.values()) / len(self.grades)
# 类方法:获取学生总数
@classmethod
def get_total(cls):
return cls.total_students
# 魔术方法:返回字符串表示
def __str__(self):
return f"{self.name}({self.age}岁)"
# 使用学生类
if __name__ == "__main__":
# 创建学生对象
s1 = Student("小明", 18)
s2 = Student("小红", 17)
# 添加成绩
s1.add_grade("数学", 90)
s1.add_grade("语文", 85)
s2.add_grade("数学", 95)
s2.add_grade("语文", 92)
s2.add_grade("英语", 88)
# 打印信息
print(s1) # 调用__str__方法
print(f"{s1.name}的平均成绩:{s1.get_average()}")
print(s2)
print(f"{s2.name}的平均成绩:{s2.get_average()}")
# 查看学生总数
print(f"学生总数:{Student.get_total()}")
总结
- 类是对象的模板,对象是类的实例
- 属性描述特征,方法描述行为
- 实例属性和方法属于具体对象,类属性和方法属于类本身
self
代表对象自身,cls
代表类本身- 魔术方法可以自定义对象的各种行为