(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.pswp.cn/diannao/91935.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络智能体研究综述

网络智能体研究综述1.什么是网络智能体1.1.核心特征1.2.分类方式1.2.1.按功能定位1.2.2. 按网络结构1.2.3.按应用场景1.3.典型应用场景1.4.技术基础1.5.发展趋势与挑战1.5.1.发展趋势1.5.2.核心挑战2.网络智能体盘点3.阿里的WebSailor3.1.WebSailor的主要功能和技术特点3.2.技术…

git 介绍与使用教程

Git 是一个 分布式版本控制系统,每个开发者都有一个完整的本地仓库(包含完整历史记录),而远程仓库(如 GitHub、GitLab、Gitee)是团队共享的中央仓库。它们的关系如下:本地仓库(Local…

[AI风堇]基于ChatGPT3.5+科大讯飞录音转文字API+GPT-SOVITS的模拟情感实时语音对话项目

[AI风堇]最近利用工作日的晚间和周末时间,我完成了一个有趣的Python编程小项目。这个项目的灵感来源于上个月在B站看到的"科技怪咖"UP主分享的一个视频,视频中展示了一个名为"DataMagic"的自动化数据处理工具,能够智能分…

物联网-规则引擎的定义

构建物联网系统中的规则引擎是一个系统性的工程,它需要处理来自海量设备的实时数据流,并根据预定义的逻辑触发动作。以下是构建一个高效、可靠、可扩展的物联网规则引擎的关键步骤和考虑因素: 核心目标 实时性: 快速处理设备事件并…

SIMATIC WinCC Unified 使用 KPI 优化流程

大家好,我是东哥说-MES基本知识 33.1 KPI组态简介现有工厂结构表示在面向对象的组态中定义标准化 KPI 概念的起点。 可通过在工厂视图中用作实例的工厂对象类型来映射工厂的各组件。在“性能指 标”(Performance indicators) 全局编辑器中,可定义全局操作…

机器学习-多重线性回归和逻辑回归

目录 1. 多重线性回归 1.1 多元线性回归 1.2 向量化(矢量化) 1.3 多元线性回归的梯度下降算法 1.4 正规方程 2. 特征缩放 2.1 特征缩放 2.2 检查梯度下降是否收敛 2.3 学习率的选择 2.4 特征工程 2.5 多项式回归 3. 逻辑回归 3.1 Motivatio…

编程思想:程序自身的模型/函数模型硬件标准如何实现

前言前面提到过写程序的过程:根据各种需求,构建程序模型(逻辑模型),再用代码实现.本贴关于程序自身的模型以及函数模型,以及推导硬件标准从逻辑到代码的思路.程序自身的模型如图应用APP接受输入---鼠标动作,键盘输入的字符等,得到结果---画面,显示数据等.工具包括框架和编程语言…

基于JAVA Spring Boot物理实验考核系统设计与实现 (文档+源码)

目录 一.研究目的 二.需求分析 三.数据库设计 四.系统页面展示 五.源码获取方式 一.研究目的 信息数据的处理完全依赖人工进行操作,会耗费大量的人工成本,特别是面对大量的数据信息时,传统人工操作不仅不能对数据的出错率进行保证&…

【国内电子数据取证厂商龙信科技】安卓镜像提取与解析

前言随着智能手机更新迭代越来越快,手机厂家对手机系统安全性要求也越来越严格。系统安全性提高对公民的隐私是一件好事,但是对于取证行业确实一个大难题,手机系统安全性的提高意味着我们能对犯罪嫌疑人手机的提取数据和恢复数据越来越少&…

Java+Ollama 本地部署 DeepSeek-R1 对话机器人:从 0 到 1 实战指南

作为 Java 开发者,想在本地搭建一个能理解代码、支持多轮对话的 AI 机器人?DeepSeek-R1 这款开源大模型绝对值得一试。今天就带大家用 OllamaJava 实现本地化部署,全程实操,新手也能跟着做! 一、先搞懂:为…

Java Web项目Dump文件分析指南

目录 1. Dump文件的类型与作用 2. 生成Dump文件的方法 3. 分析Dump文件的工具 4. 分析步骤与常见问题解决 5. 最佳实践与预防 在Java Web项目中,dump文件是JVM(Java虚拟机)在发生崩溃、内存溢出或特定事件时生成的内存快照文件&#xff0…

Ubuntu网卡驱动无效,不能连接wifi上网

一、现象及临时网络准备 我的另一篇博客详细介绍了前期准备工作: 知乎:Ubuntu网卡驱动无效,不能连接wifi上网知乎:Ubuntu网卡驱动无效,不能连接wifi上网 在此基础上,还得给Ubuntu配好镜像源,…

LeetCode Hot 100 二叉搜索树中第 K 小的元素

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。示例 1:输入:root [3,1,4,null,2], k 1 输出:1示例 2:输入&#xff1a…

5-大语言模型—理论基础:注意力机制优化

目录 1、稀疏注意力机制(Sparse Attention) 1.1、核心问题:传统注意力的 “效率瓶颈” 1.2、具体稀疏策略(详细计算逻辑) 1.2.1、局部窗口稀疏(Local Window Sparse) 1.2.2、基于内容的稀疏…

轻松学习C++:基本语法解析

基本语法解析引言基本语法变量和数据类型运算符控制结构函数示例代码:计算圆的面积引言 C是一种功能强大的通用编程语言,由Bjarne Stroustrup于1979年创建。它在C语言的基础上进行了扩展,支持面向对象编程、泛型编程和过程式编程。C以其高性…

Python Pandas读取Excel表格中数据并根据时间字段筛选数据

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录Python Pandas读取Excel表格中数据并根据时间…

CS231n-2017 Lecture3线性分类器、最优化笔记

图片向量与标签得分向量:上节讲到,图片可以被展开成一个向量,对于这个向量,假设它有D维,那么它就是D维空间的一个点,又假设我们的标签集合总共有K种,我们可以定义一个K维标签得分向量&#xff0…

windows wsl ubuntu 如何安装 open-jdk8

安装步骤 jdk dhd:~$ java -version Command java not found, but can be installed with: sudo apt install openjdk-11-jre-headless # version 11.0.20.11-0ubuntu1~22.04, or sudo apt install default-jre # version 2:1.11-72build2 sudo apt install op…

Javascript进程和线程通信

JavaScript 中的进程通信(IPC)和线程通信是实现高性能、高并发应用的核心技术,尤其在处理 CPU 密集型任务或跨环境数据交互时至关重要。以下从底层机制到应用场景的详解:🧩 ​​一、进程通信(Inter-Process…

堆堆堆,咕咕咕

1.找TopK问题要找到最前面的k个元素void swap(int *a,int *b) {int temp*a;*a*b;*btemp; } //向下调整最小堆 void minheapify(int arr[],int n,int index) {int left2*index1;int right2*index2;int smallestindex;if(left<n&&arr[left]<arr[smallest]) smalles…