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

Python 面向对象编程(OOP)全面详解:类、对象与 API

1. 前言:为什么需要面向对象编程?

面向对象编程(OOP)是一种组织代码的方式,它将数据和操作数据的方法封装成类(Class),并通过对象(Object)来使用这些功能。Python 作为一门支持 OOP 的语言,提供了强大的类和对象机制,适用于 GUI 开发、Web 框架(如 Django)、数据分析(如 Pandas)等场景。

1.1 OOP 的四大特性

  1. 封装(Encapsulation):隐藏内部实现,仅暴露必要接口。

  2. 继承(Inheritance):子类复用父类的属性和方法。

  3. 多态(Polymorphism):同一方法在不同类中有不同实现。

  4. 抽象(Abstraction):定义接口而不关心具体实现。


2. Python 类与对象基础

2.1 类的定义与实例化

class Dog:  # 类名通常首字母大写# 类属性(所有实例共享)species = "Canis lupus"def __init__(self, name, age):  # 构造方法,self 代表实例本身self.name = name  # 实例属性self.age = agedef bark(self):  # 实例方法print(f"{self.name} 汪汪叫!")# 实例化对象、通常情况下一个对象只属于一个类:原因-如果遇到多继承,对象不知道需要调用哪个类方法
my_dog = Dog("阿黄", 3)
my_dog.bark()  # 输出: 阿黄 汪汪叫!

2.2 类属性 vs 实例属性

特性类属性实例属性
定义位置类内部,方法外部__init__ 或其他方法内
访问方式类名.属性 或 实例.属性只能通过 实例.属性
修改影响影响所有实例仅影响当前实例

示例:

print(Dog.species)  # 类属性访问
my_dog.name = "小黑"  # 修改实例属性

3. 类的继承与方法重写

3.1 基本继承

class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("子类必须实现此方法")class Cat(Animal):  # 继承 Animaldef speak(self):  # 方法重写print(f"{self.name} 喵喵叫!")my_cat = Cat("小白")
my_cat.speak()  # 输出: 小白 喵喵叫!

注意:

  • 如果子类没有实现父类的抽象方法(如 speak),会触发 NotImplementedError


3.2 多重继承与 MRO

Python 支持多重继承,方法解析顺序(MRO)由 C3 算法决定:

class A:def show(self):print("A")class B(A):def show(self):print("B")class C(A):def show(self):print("C")class D(B, C):passd = D()
d.show()  # 输出: B(按 MRO 顺序:D -> B -> C -> A)
print(D.__mro__)  # 查看 MRO 顺序

4. 特殊方法(魔术方法)

Python 通过 __xxx__ 形式(这里的前后下划线都是双下划线)的特殊方法实现运算符重载、对象生命周期控制等。

4.1 常用魔术方法

方法作用示例
__str__定义 print(obj) 的输出def __str__(self): return self.name
__len__定义 len(obj) 的行为def __len__(self): return len(self.data)
__add__定义 obj1 + obj2 的行为def __add__(self, other): return self.value + other.value

示例:

class Vector:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):  # 重载 + 运算符return Vector(self.x + other.x, self.y + other.y)v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2  # 调用 __add__
print(v3.x, v3.y)  # 输出: 4 6

5. API 的使用详解

5.1 什么是 API?

API(Application Programming Interface)是预定义的方法或函数,供开发者调用(如 requests.get()json.loads())。

5.2 如何阅读 API 文档?

以 datetime 模块为例:

from datetime import datetime# 获取当前时间
now = datetime.now()  # 调用类方法
print(now)  # 输出: 2023-10-01 12:34:56.789012# 格式化时间
formatted = now.strftime("%Y-%m-%d %H:%M:%S")  # strftime 是实例方法
print(formatted)  # 输出: 2023-10-01 12:34:56

6. 实战:封装一个 HTTP 请求工具类 

import requestsclass HttpClient:def __init__(self, base_url):self.base_url = base_urldef get(self, endpoint, params=None):"""发送 GET 请求:param endpoint: API 路径(如 "/users"):param params: 查询参数(字典):return: 响应数据(JSON 格式)"""url = self.base_url + endpointresponse = requests.get(url, params=params)return response.json()# 使用示例
client = HttpClient("https://api.example.com")
data = client.get("/users", params={"page": 1})
print(data)

关键点:

  • requests.get(url, params) 的 params 参数会自动拼接到 URL(如 ?page=1)。

  • response.json() 将响应解析为 Python 字典。


7. 总结

  • 是模板,对象是实例。

  • 继承实现代码复用,多态增强灵活性。

  • 魔术方法定制对象行为。

  • API 调用需关注参数和返回值。

进一步学习:

  • Python 官方文档 - Classes

  • requests 库:Requests: HTTP for Humans

你的点赞和收藏是我创作的动力! 🚀

 

 

 

 

 

 

 

 

 

 

 

 

 

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

相关文章:

  • 【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
  • 线程池的七个参数设计源于对高并发场景下资源管理、系统稳定性与性能平衡的深刻洞察
  • Policy Gradient【强化学习的数学原理】
  • 【C语言刷题】第十一天:加量加餐继续,代码题训练,融会贯通IO模式
  • JMM--数据原子操作
  • Python asyncio库与GIL之间的关系,是否能够解决核心问题?
  • Spring--循环依赖以及三级缓存详解
  • Linux安装java后没法运行
  • 计算机组成原理《浮点数的存储》
  • Python基础之字典(Dictionary)全面指南
  • 南山科技园的步行
  • Qt项目锻炼——TODO清单(三)
  • 【论文笔记】OctoThinker:突破 Llama 推理瓶颈的中期训练范式
  • 乌邦图(20.04)添加中文拼音(中文输入法)
  • 实现电池储能装置的双向DCDC
  • Qt项目锻炼——TODO清单(二)
  • jmm--volatile
  • 前端面试专栏-算法篇:18. 查找算法(二分查找、哈希查找)
  • vue3 el-input el-select 非空校验
  • 大数据学习2:HIve
  • Linux进程管理:从基础到实战
  • Qt Ribbon效果界面
  • QT6 源(154)模型视图架构里的列表视图 QListView:先学习属性部分,
  • 认识Redis
  • Chat Model API
  • 60天python训练营打卡day52
  • 运算方法和运算器补充
  • 如何录制带备注的演示文稿(LaTex Beamer + Pympress)
  • Codeforces Round 919 (Div. 2) D. Array Repetition(分块,1900)
  • 【深圳大学机器学习】实验一:PCA算法