当前位置: 首页 > news >正文

(Python)类和类的方法(基础教程介绍)(Python基础教程)

源代码:

class Students:stats="大学"def __init__(self,name,age,sex,credit):self.name=nameself.age=ageself.sex=sexself.credit=creditdef 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=paydef 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

这种方式的三大问题

  1. 数据分散:相关信息分散在不同变量中

  2. 管理困难:添加新学生需要创建多个变量

  3. 行为缺失:无法定义与数据相关的操作(如自我介绍)

类的解决方案:

class Person:def __init__(self, name, age, sex):self.name = nameself.age = ageself.sex = sexdef 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 = nameself.age = ageself.sex = sexself.credit = credit# 5. 实例方法def tell(self):return f"{self.name}说:你好"
五个核心组件:
  1. 类定义class 类名:

    • 类名使用大驼峰命名法(如Students

    • 创建对象的蓝图

  2. 类属性

    • 定义在类内部,方法外部

    • 所有对象共享同一值

    print(Students.stats)  # "大学"
  3. 构造方法 __init__

    • 创建对象时自动调用

    • self 参数代表当前对象(必须存在)

    • 用于初始化对象状态

  4. 实例属性

    • __init__中通过self.属性名=值定义

    • 每个对象有独立副本

    student1 = Students("小明", 20, "男", 5)
    student2 = Students("小红", 19, "女", 8)
    print(student1.name)  # "小明"
    print(student2.name)  # "小红"(不同值)
  5. 实例方法

    • 定义在类中的函数

    • 第一个参数必须是self

    • 通过对象调用:对象.方法()

    print(student1.tell())  # "小明说:你好"

三、创建和使用对象:从蓝图到实体

实例化过程
# 创建学生对象
student = Students("大炮", 21, "男", 10)

内存中发生了什么

  1. Python 在内存中分配新空间

  2. 调用 __init__ 方法:

    Students.__init__(student, "大炮", 21, "男", 10)
  3. 初始化属性:

    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)  # 学分设为0self.pay = pay  # 5. 添加新属性# 6. 重写方法def tell(self):return f"{self.name}说:我不好"
继承六大要点:
  1. 继承语法class 子类(父类)

    • 教师类继承学生类的所有属性和方法

  2. 重写类属性

    • 子类定义同名属性覆盖父类

    python

    print(Teachers.stats)  # "教师"(而非"大学")
  3. 重写构造方法

    • 子类可以定义自己的__init__

  4. super()函数

    • 调用父类的方法

    • super().__init__(参数) 初始化继承的属性

    • 必须放在子类构造方法开头

  5. 添加新属性

    self.pay = pay  # 教师特有属性
  6. 重写方法

    • 定义同名方法覆盖父类实现

    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():  # ❌ 缺少selfreturn "你好"# 正确:
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 = "大学"  # ✅ 类属性

七、类设计最佳实践

  1. 单一职责原则:每个类只负责一个功能领域

  2. 命名规范

    • 类名:大驼峰 UniversityPerson

    • 方法名:小写蛇形 calculate_grade

    • 属性名:小写蛇形 student_id

  3. 封装思想:隐藏内部细节,暴露必要接口

    class BankAccount:def __init__(self, balance):self.__balance = balance  # 私有属性def deposit(self, amount):  # 公开接口if amount > 0:self.__balance += amount
  4. 使用属性装饰器

    class Circle:def __init__(self, radius):self.radius = radius@propertydef area(self):  # 作为属性访问return 3.14 * self.radius ** 2c = Circle(5)
    print(c.area)  # 78.5(不是c.area())

八、扩展练习:打造校园管理系统

# 1. 添加课程类
class Course:def __init__(self, name, credit):self.name = nameself.credit = creditself.students = []def enroll(self, student):self.students.append(student)student.credit += self.creditreturn 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]}")  # ['小明']

九、学习路径建议

  1. 基础阶段

    • 创建简单类(如BookCar

    • 练习__init__和属性定义

    • 添加基本方法

  2. 中级阶段

    • 实现类继承(如ElectricCar继承Car

    • 使用方法重写

    • 学习super()的使用

  3. 高级阶段

    • 掌握特殊方法(__str____len__

    • 使用属性装饰器@property

    • 实现简单的类关系(如学生-课程关系)

  4. 项目实践

💡 终极建议:从你的学生/教师类出发,逐步添加:

  1. 成绩管理功能

  2. 课程表系统

  3. 校园卡消费功能

  4. 数据持久化(存储到文件)

掌握类的核心概念后,你将能够构建更复杂、更易维护的Python程序!🚀

http://www.dtcms.com/a/287339.html

相关文章:

  • 7月19日日记
  • SpringAI_Chat模型_DeepSeek模型--基础对话
  • Word快速文本对齐程序开发经验:从需求分析到实现部署
  • 嵌入式单片机开发 - Keil MDK 复制工程
  • Python day18
  • MySQL事务管理(上)(12)
  • xss-labs靶场1-8
  • DAMA数据管理具像化解读|第一章数据管理|业务驱动因素
  • 暑期训练8
  • 13.4 Meta LLaMA开源模型家族全面解析:从Alpaca到Vicuna的技术内幕
  • 外观设计模式
  • 删除debian xdm自启动ibus的配置项
  • 2021 RoboCom 世界机器人开发者大赛-本科组(初赛)解题报告 | 珂学家
  • c语言-数据结构-如何用分冶法求得二叉树的节点数与高度?
  • CSS篇——第一章 六十五项关键技能(上篇)
  • Node.js特训专栏-实战进阶:17.会话管理与安全存储
  • Rust+ChatBoxAI:实战
  • 多模态交互视角下生成式人工智能在中小学探究式学习中的认知支架效能研究
  • SpringBoot项目部署至云服务器
  • Django接口自动化平台实现(三)
  • YOLOv11改进 | RFAConv重塑空间注意力助力性能提升
  • 2025第15届上海国际生物发酵展:聚焦合成生物与绿色制造,共启生物经济新时代
  • 数据集下载网站
  • 进阶向:基于Python的智能客服系统设计与实现
  • Spring之【AnnotatedBeanDefinitionReader】
  • Django母婴商城项目实践(十一)- 用户信息模块之用户登录注册
  • 【vue-5】Vue 3 中的 v-model:双向数据绑定的全面指南
  • 基于Python的口腔正畸健康教育聊天机器人开发与评估研究
  • XSS漏洞学习总结
  • 【Linux】基本指令详解(三) 指令本质、三个查找指令、打包压缩、重要热键、linux体系结构、命令行解释器