Python 面向对象编程核心知识点深度解析

面向对象编程(OOP)是 Python 中最重要的编程范式之一,它将数据和操作数据的方法封装在一起,提高了代码的复用性和可维护性。本文将结合实际代码示例,详细讲解 Python 面向对象编程的核心概念和常用技巧。

一、类与对象的基本概念

1.1 面向过程与面向对象的区别

  • 面向过程:像 "蛋炒饭",步骤紧密耦合,一步接着一步执行(如打开冰箱→放入大象→关闭冰箱)
  • 面向对象:像 "盖浇饭",将功能封装成独立组件(如冰箱类负责开关,大象类负责进出)

1.2 类与对象的定义

  • :是对象的抽象模板,包含一类事物的共有特征(属性)和行为(方法)
  • 对象:是类的实例化,是具体的事物
# 定义Student类
class Student:# 构造方法:创建对象时自动执行,初始化实例属性def __init__(self, name, age):self.name = name  # 实例属性self.age = age    # 实例属性# 实例方法:定义对象的行为def show_info(self):print(self.name, self.age)# 创建对象(实例化)
zs = Student('张三', 20)
ls = Student('李四', 22)# 访问属性和方法
print(zs.name)  # 输出:张三
zs.show_info()  # 输出:张三 20

提示:self代表当前对象,谁调用方法就指代谁

二、类属性与实例属性

属性分为两种:类属性和实例属性,它们的作用域和访问方式有所不同。

import mathclass Circle:PI = math.pi  # 类属性:属于类,所有对象共享def __init__(self, r):self.r = r  # 实例属性:每个对象独有的属性# 访问类属性
print(Circle.PI)  # 方式1:类名.属性名,输出:3.14159...
c1 = Circle(2)
print(c1.PI)      # 方式2:对象名.属性名(不推荐,建议用类名访问)# 访问实例属性
print(c1.r)       # 只能通过对象访问,输出:2

区别总结

  • 类属性:所有对象共享,定义在类中、方法外
  • 实例属性:每个对象独有,定义在__init__方法中
  • 类属性推荐用类名.属性名访问,实例属性用对象名.属性名访问

三、三大方法类型:实例方法、类方法、静态方法

3.1 实例方法

  • 第一个参数必须是self(指代当前对象)
  • 可访问实例属性和类属性
  • 通过对象名.方法名()调用
def show(self):  # 实例方法print(f"实例属性:{self.n},类属性:{self.count}")

3.2 类方法

  • @classmethod装饰器标识
  • 第一个参数必须是cls(指代当前类)
  • 主要用于操作类属性,不能直接访问实例属性
  • 通过类名.方法名()调用
@classmethod
def set_count(cls):  # 类方法cls.count += 1  # 操作类属性

3.3 静态方法

  • @staticmethod装饰器标识
  • 没有默认参数(不需要selfcls
  • 不能直接访问实例属性,可通过类名.类属性访问类属性
  • 更像独立的工具函数,与类和对象关联较弱
  • 通过类名.方法名()调用
@staticmethod
def check_str(s):  # 静态方法return s == s[::-1]  # 判断回文串

四、对象的字符串表示

当我们打印对象时,默认显示的是内存地址,通过__str____repr__可以自定义对象的字符串形式。

import jsonclass Student:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):# 用于print输出,更友好的字符串return json.dumps(self.__dict__, ensure_ascii=False)def __repr__(self):# 用于解释器显示(如在列表中),通常与__str__保持一致return self.__str__()zs = Student('张三', 20)
print(zs)  # 输出:{"name": "张三", "age": 20}
print([zs])  # 输出:[{"name": "张三", "age": 20}](因__repr__生效)

区别

  • __str__:面向用户,侧重可读性
  • __repr__:面向开发者,侧重准确性(调试用)

五、类的魔术方法

Python 中以__开头和结尾的方法称为魔术方法,它们在特定场景下自动调用。

5.1 构造与初始化

  • __new__:创建对象(先执行)
  • __init__:初始化对象属性(后执行)
class Student:def __new__(cls, *args, **kwargs):print('创建对象...')return super().__new__(cls)  # 必须返回创建的对象def __init__(self, name, age):print('初始化属性...')self.name = nameself.age = age

5.2 运算符重载

通过魔术方法可以自定义对象的运算符行为:

class Student:def __init__(self, age):self.age = agedef __add__(self, other):  # 定义+运算return self.age + other.agedef __gt__(self, other):  # 定义>运算return self.age > other.agezs = Student(20)
ls = Student(30)
print(zs + ls)  # 输出:50(调用__add__)
print(zs > ls)  # 输出:False(调用__gt__)

常用运算符魔术方法:

  • 算术:__add__(+)、__sub__(-)、__mul__(*)、__truediv__(/)
  • 比较:__gt__(>)、__lt__(<)、__eq__(==)、__ne__(!=)

六、获取类与对象的信息

在开发和调试中,我们常需要查看类和对象的信息,常用方法如下:

class Student:"""学生类"""def __init__(self, name, age):self.name = nameself.age = agezs = Student('张三', 20)# 查看对象属性字典
print(zs.__dict__)  # 输出:{'name': '张三', 'age': 20}# 查看对象/类的所有成员
print(dir(zs))       # 对象的所有属性和方法
print(dir(Student))  # 类的所有成员# 类的元信息
print(Student.__name__)  # 类名:Student
print(Student.__doc__)   # 类文档:学生类
print(Student.__base__)  # 父类:<class 'object'>

七、实战案例:商品库存管理

下面通过一个商品管理类,综合应用上述知识:

class Product:def __init__(self, name, stock):self.name = name  # 商品名称self.stock = stock  # 库存def add_stock(self, quantity):"""增加库存"""self.stock += quantitydef reduce_stock(self, quantity):"""减少库存,库存不足时提示"""if quantity > self.stock:print("库存不足")else:self.stock -= quantitydef display_stock(self):"""显示当前库存"""return self.stock# 使用示例
p = Product('笔', 50)
p.add_stock(10)
print(p.display_stock())  # 输出:60
p.reduce_stock(12)
print(p.display_stock())  # 输出:48

总结

面向对象编程是 Python 开发的核心技能,本文介绍了类与对象、属性与方法、魔术方法等关键知识点。掌握这些概念后,你可以编写出更模块化、更易维护的代码。记住,多练习是掌握面向对象编程的关键,尝试将这些知识应用到实际项目中吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92063.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92063.shtml

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

相关文章

Java学习第一百部分——Kafka

目录 一、前言提要 二、核心价值 三、核心架构 四、基本用途 五、优势总结 六、相关技术 七、详细用途 八、高级用法 九、最佳实践 十、总结定位 一、前言提要 Apache Kafka 是一个强大的开源分布式流处理平台&#xff0c;专为处理高吞吐量、低延迟的实时数据流而设计…

[spring-cloud: 负载均衡]-源码分析

获取服务列表 ServiceInstanceListSupplier ServiceInstanceListSupplier 接口是一个提供 ServiceInstance 列表的供应者&#xff0c;返回一个响应式流 Flux<List<ServiceInstance>>&#xff0c;用于服务发现。 public interface ServiceInstanceListSupplier e…

Oracle 在线重定义

Oracle 在线重定义&#xff08;Online Redefinition&#xff09; 是一种功能&#xff0c;通过DBMS_REDEFINITION 包提供&#xff0c;允许DBA在不需要停止或显著影响数据库正常操作的情况下&#xff0c;对数据库表进行结构化修改。可以实现的功能将表移动到其它表空间增加、修改…

Web 开发 12

1 网址里的 “搜索请求” 结构 这张图是在教你怎么看懂 网址里的 “搜索请求” 结构&#xff0c;特别基础但超重要&#xff0c;对你学前端帮别人做搜索功能超有用&#xff0c;用大白话拆成 3 步讲&#xff1a; 1. 先看「协议&#xff08;Protocol&#xff09;」 HTTPS 就是浏…

网络安全 | 如何构建一个有效的企业安全响应团队

网络安全 | 如何构建一个有效的企业安全响应团队 一、前言 二、团队组建的基础要素 2.1 人员选拔 2.2 角色定位 三、团队应具备的核心能力 3.1 技术专长 3.2 应急处置能力 3.3 沟通协作能力 四、团队的运作机制 4.1 威胁监测与预警流程 4.2 事件响应流程 4.3 事后复盘与改进机制…

HTTP、WebSocket、TCP、Kafka等通讯渠道对比详解

在当今互联的数字世界中&#xff0c;通信渠道是系统、应用程序和设备之间数据交换的支柱。从传统的HTTP和TCP协议到专为特定场景设计的Kafka和MQTT等平台&#xff0c;这些通信方式满足了从实时消息传递到大规模数据流处理的多样化需求。本文将深入探讨主要的通信协议和平台。一…

臭氧、颗粒物和雾霾天气过程的大气污染物计算 CAMx模型

随着我国经济快速发展&#xff0c;我国面临着日益严重的大气污染问题。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因素是控制大气污染的关键自然因素。大气污染问题既是局部、当地的&#xff0c;也是区域的&#xff0c;甚至是全球…

数据结构(13)堆

目录 1、堆的概念与结构 2、堆的实现 2.1 向上调整算法&#xff08;堆的插入&#xff09; 2.2 向下调整算法&#xff08;堆的删除&#xff09; 2.3 完整代码 3、堆的应用 3.1 堆排序 3.2 Top-K问题 1、堆的概念与结构 堆是一种特殊的二叉树&#xff0c;根结点最大的堆称…

C++模板知识点3『std::initializer_list初始化时逗号表达式的执行顺序』

std::initializer_list初始化时逗号表达式的执行顺序 在使用Qt Creator4.12.2&#xff0c;Qt5.12.9 MinGW开发的过程中发现了一个奇怪的现象&#xff0c;std::initializer_list<int>在初始化构造时的执行顺序反了&#xff0c;经过一番测试发现&#xff0c;其执行顺序可正…

【Unity3D】Shader圆形弧度裁剪

片元着色器&#xff1a; float3 _Center float3(0, 0, 0); float3 modelPos i.modelPos;// float angle atan2(modelPos.y - _Center.y, modelPos.x - _Center.x); // 计算角度&#xff0c;范围-π到π float angle atan2(modelPos.y - _Center.y, modelPos.z - _Center.z)…

curl发送文件bodyParser无法获取请求体的问题分析

问题及现象 开发过程使用curlPUT方式发送少量数据, 后端使用NodeJSexpress框架bodyParser,但测试发现无法获取到请求体内容,现象表现为req.body 为空对象 {} 代码如下: const bodyParser require(body-parser); router.use(/api/1, bodyParser.raw({limit: 10mb, type: */*}))…

Vue3 学习教程,从入门到精通,Vue 3 内置属性语法知识点及案例代码(25)

Vue 3 内置属性语法知识点及案例代码 Vue 3 提供了丰富的内置属性&#xff0c;帮助开发者高效地构建用户界面。以下将详细介绍 Vue 3 的主要内置属性&#xff0c;并结合详细的案例代码进行说明。每个案例代码都包含详细的注释&#xff0c;帮助初学者更好地理解其用法。1. data …

机器学习基石:深入解析线性回归

线性回归是机器学习中最基础、最核心的算法之一&#xff0c;它为我们理解更复杂的模型奠定了基础。本文将带你全面解析线性回归的方方面面。1. 什么是回归&#xff1f; 回归分析用于预测连续型数值。它研究自变量&#xff08;特征&#xff09;与因变量&#xff08;目标&#xf…

OneCodeServer 架构深度解析:从组件设计到运行时机制

一、架构概览与设计哲学1.1 系统定位与核心价值OneCodeServer 作为 OneCode 平台的核心服务端组件&#xff0c;是连接前端设计器与后端业务逻辑的桥梁&#xff0c;提供了从元数据定义到应用程序执行的完整解决方案。它不仅是一个代码生成引擎&#xff0c;更是一个全生命周期管理…

Jwts用于创建和验证 ​​JSON Web Token(JWT)​​ 的开源库详解

Jwts用于创建和验证 ​​JSON Web Token&#xff08;JWT&#xff09;​​ 的开源库详解在 Java 开发中&#xff0c;提到 Jwts 通常指的是 ​​JJWT&#xff08;Java JWT&#xff09;库​​中的核心工具类 io.jsonwebtoken.Jwts。JJWT 是一个专门用于创建和验证 ​​JSON Web To…

如果发送的数据和接受的数据不一致时,怎么办?

那ART4222这个板卡举例&#xff0c;我之间输入一个原始数据“6C532A14”&#xff0c;但是在选择偶校验时&#xff0c;接收的是“6C532B14”&#xff0c;我发送的码率&#xff08;运行速度&#xff09;是100000&#xff0c;但接受的不稳定&#xff0c;比如&#xff1b;“100100.…

ISCC认证:可持续生产的新标杆。ISCC如何更快认证

在全球可持续发展浪潮中&#xff0c;ISCC&#xff08;国际可持续与碳认证&#xff09;体系已成为企业绿色转型的重要工具。这一国际公认的认证系统覆盖农业、林业、废弃物处理等多个领域&#xff0c;通过严格的可持续性标准、供应链可追溯性要求和碳排放计算规范&#xff0c;建…

想对学习自动化测试的一些建议

Python接口自动化测试零基础入门到精通&#xff08;2025最新版&#xff09;接触了不少同行&#xff0c;由于他们之前一直做手工测试&#xff0c;现在很迫切希望做自动化测试&#xff0c;其中不乏工作5年以上的人。 本人从事软件自动化测试已经近5年&#xff0c;从server端到web…

电子电气架构 ---智能电动汽车嵌入式软件开发过程中的block点

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

createAsyncThunk

下面&#xff0c;我们来系统的梳理关于 Redux Toolkit 异步操作&#xff1a;createAsyncThunk 的基本知识点&#xff1a;一、createAsyncThunk 概述 1.1 为什么需要 createAsyncThunk 在 Redux 中处理异步操作&#xff08;如 API 调用&#xff09;时&#xff0c;传统方法需要手…