Python 面向对象编程(OOP)全面详解:类、对象与 API
1. 前言:为什么需要面向对象编程?
面向对象编程(OOP)是一种组织代码的方式,它将数据和操作数据的方法封装成类(Class),并通过对象(Object)来使用这些功能。Python 作为一门支持 OOP 的语言,提供了强大的类和对象机制,适用于 GUI 开发、Web 框架(如 Django)、数据分析(如 Pandas)等场景。
1.1 OOP 的四大特性
-
封装(Encapsulation):隐藏内部实现,仅暴露必要接口。
-
继承(Inheritance):子类复用父类的属性和方法。
-
多态(Polymorphism):同一方法在不同类中有不同实现。
-
抽象(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
你的点赞和收藏是我创作的动力! 🚀