源代码:
class Students:
stats="大学"
def __init__(self,name,age,sex,credit):
self.name=name
self.age=age
self.sex=sex
self.credit=credit
def tell(self):
return f"{self.name}说:你好"
class Teachers(Students):
stats="教师"
def __init__(self, name, age, sex,pay):
super().__init__(name, age, sex,0)
self.pay=pay
def tell(self):
return f"{self.name}说:我不好"
student=Students("大炮",21,"男",10)
print(student.tell())
print(student.stats)
print(student.credit)
teacher=Teachers("富贵",55,"男",10000)
print(teacher.tell())
print(teacher.stats)
print(teacher.pay)
代码详解:
Python 类(Class)完全新手教程:从零理解面向对象编程
一、为什么需要类?真实世界类比
想象你要管理一所大学的学生和教师信息。没有类时,你需要这样存储数据:
# 学生信息
student1_name = "大炮"
student1_age = 21
student1_sex = "男"
student1_credit = 10
# 教师信息
teacher1_name = "富贵"
teacher1_age = 55
teacher1_sex = "男"
teacher1_pay = 10000
这种方式的三大问题:
数据分散:相关信息分散在不同变量中
管理困难:添加新学生需要创建多个变量
行为缺失:无法定义与数据相关的操作(如自我介绍)
类的解决方案:
class Person:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def introduce(self):
return f"我是{self.name},{self.age}岁"
student = Person("大炮", 21, "男")
teacher = Person("富贵", 55, "男")
二、类的基本结构详解
学生类代码分析
class Students: # 1. 类定义
stats = "大学" # 2. 类属性
# 3. 构造方法
def __init__(self, name, age, sex, credit):
# 4. 实例属性初始化
self.name = name
self.age = age
self.sex = sex
self.credit = credit
# 5. 实例方法
def tell(self):
return f"{self.name}说:你好"
五个核心组件:
类定义:
class 类名:
类名使用大驼峰命名法(如
Students
)创建对象的蓝图
类属性:
定义在类内部,方法外部
所有对象共享同一值
print(Students.stats) # "大学"
构造方法
__init__
:创建对象时自动调用
self
参数代表当前对象(必须存在)用于初始化对象状态
实例属性:
在
__init__
中通过self.属性名=值
定义每个对象有独立副本
student1 = Students("小明", 20, "男", 5) student2 = Students("小红", 19, "女", 8) print(student1.name) # "小明" print(student2.name) # "小红"(不同值)
实例方法:
定义在类中的函数
第一个参数必须是
self
通过对象调用:
对象.方法()
print(student1.tell()) # "小明说:你好"
三、创建和使用对象:从蓝图到实体
实例化过程
# 创建学生对象
student = Students("大炮", 21, "男", 10)
内存中发生了什么:
Python 在内存中分配新空间
调用
__init__
方法:Students.__init__(student, "大炮", 21, "男", 10)
初始化属性:
student.name = "大炮" student.age = 21 student.sex = "男" student.credit = 10
访问对象成员
# 访问属性
print(student.name) # "大炮"(实例属性)
print(student.stats) # "大学"(类属性)
# 调用方法
print(student.tell()) # "大炮说:你好"
📌 重要提示:类属性 vs 实例属性
Students.stats = "学院" # 修改类属性 print(student.stats) # 输出"学院"(所有对象同步改变) student.name = "小炮" # 修改实例属性 print(student.name) # 输出"小炮"(仅影响当前对象)
四、继承:创建教师类
继承是面向对象的核心概念,允许我们基于现有类创建新类。
你的教师类代码分析
class Teachers(Students): # 1. 继承语法
stats = "教师" # 2. 重写类属性
# 3. 重写构造方法
def __init__(self, name, age, sex, pay):
# 4. 调用父类构造方法
super().__init__(name, age, sex, 0) # 学分设为0
self.pay = pay # 5. 添加新属性
# 6. 重写方法
def tell(self):
return f"{self.name}说:我不好"
继承六大要点:
继承语法:
class 子类(父类)
教师类继承学生类的所有属性和方法
重写类属性:
子类定义同名属性覆盖父类
python
print(Teachers.stats) # "教师"(而非"大学")
重写构造方法:
子类可以定义自己的
__init__
super()函数:
调用父类的方法
super().__init__(参数)
初始化继承的属性必须放在子类构造方法开头
添加新属性:
self.pay = pay # 教师特有属性
重写方法:
定义同名方法覆盖父类实现
teacher.tell() # 调用子类版本:"富贵说:我不好"
继承关系图解
五、完整代码执行流程分析
# ====== 学生部分 ======
student = Students("大炮", 21, "男", 10)
# 1. 创建Students对象
# 2. 调用__init__:设置name="大炮", age=21, sex="男", credit=10
# 3. 类属性stats="大学"
print(student.tell()) # 4. 调用tell() → "大炮说:你好"
print(student.stats) # 5. 访问类属性 → "大学"
print(student.credit) # 6. 访问实例属性 → 10
# ====== 教师部分 ======
teacher = Teachers("富贵", 55, "男", 10000)
# 7. 创建Teachers对象
# 8. 调用Teachers.__init__
# 9. 在Teachers.__init__中:
# - super().__init__(name, age, sex, 0) → 调用Students.__init__
# - 设置pay=10000
# 10. 类属性stats="教师"(覆盖父类)
print(teacher.tell()) # 11. 调用重写的tell() → "富贵说:我不好"
print(teacher.stats) # 12. 访问重写的类属性 → "教师"
print(teacher.pay) # 13. 访问新增属性 → 10000
print(teacher.credit) # 14. 访问继承属性 → 0
六、常见问题解决方案(基于真实错误)
问题1:忘记self参数
# 错误:方法缺少self
def tell(): # ❌ 缺少self
return "你好"
# 正确:
def tell(self): # ✅
return f"{self.name}说:你好"
问题2:属性初始化错误
# 错误:未正确赋值
self.credit # ❌ 缺少赋值操作
# 正确:
self.credit = credit # ✅
问题3:继承时参数不匹配
# 错误:父类需要4个参数,只传了3个
super().__init__(name, age, sex) # ❌
# 正确:添加缺失参数
super().__init__(name, age, sex, 0) # ✅
问题4:混淆类属性和实例属性
# 错误:在方法中错误定义类属性
def __init__(self, name):
self.stats = "学院" # ❌ 这是实例属性
# 正确定义类属性:
class Students:
stats = "大学" # ✅ 类属性
七、类设计最佳实践
单一职责原则:每个类只负责一个功能领域
命名规范:
类名:大驼峰
UniversityPerson
方法名:小写蛇形
calculate_grade
属性名:小写蛇形
student_id
封装思想:隐藏内部细节,暴露必要接口
class BankAccount: def __init__(self, balance): self.__balance = balance # 私有属性 def deposit(self, amount): # 公开接口 if amount > 0: self.__balance += amount
使用属性装饰器:
class Circle: def __init__(self, radius): self.radius = radius @property def area(self): # 作为属性访问 return 3.14 * self.radius ** 2 c = Circle(5) print(c.area) # 78.5(不是c.area())
八、扩展练习:打造校园管理系统
# 1. 添加课程类
class Course:
def __init__(self, name, credit):
self.name = name
self.credit = credit
self.students = []
def enroll(self, student):
self.students.append(student)
student.credit += self.credit
return f"{student.name}已选课《{self.name}》"
# 2. 改进学生类
class Students:
# ...原有代码...
def take_course(self, course):
return course.enroll(self)
# 3. 使用示例
math = Course("高等数学", 4)
student = Students("小明", 20, "男", 0)
print(student.take_course(math)) # 小明已选课《高等数学》
print(f"小明学分:{student.credit}") # 4
print(f"选课学生:{[s.name for s in math.students]}") # ['小明']
九、学习路径建议
基础阶段:
创建简单类(如
Book
,Car
)练习
__init__
和属性定义添加基本方法
中级阶段:
实现类继承(如
ElectricCar
继承Car
)使用方法重写
学习
super()
的使用
高级阶段:
掌握特殊方法(
__str__
,__len__
)使用属性装饰器
@property
实现简单的类关系(如学生-课程关系)
项目实践:
💡 终极建议:从你的学生/教师类出发,逐步添加:
成绩管理功能
课程表系统
校园卡消费功能
数据持久化(存储到文件)
掌握类的核心概念后,你将能够构建更复杂、更易维护的Python程序!🚀