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

【python】OOP编程从0到1

📚 Python 面向对象编程(OOP)全面学习指南
面向对象编程是构建复杂程序的核心理念,掌握它能让代码更模块化、易维护。以下从基础到进阶,系统整理 Python OOP 的关键知识。


一、核心概念

1. 类(Class)与对象(Object)
  • :对象的蓝图,定义属性和方法。
  • 对象:类的实例,具备具体属性和行为。
class Dog:def __init__(self, name, age):  # 构造方法self.name = name  # 实例属性self.age = agedef bark(self):  # 方法print(f"{self.name} 汪汪叫!")# 创建对象
my_dog = Dog("Buddy", 3)
my_dog.bark()  # 输出:Buddy 汪汪叫!

2. 面向对象四大特性
特性描述
封装隐藏内部实现,通过方法暴露可控操作(如属性访问限制)。
继承子类继承父类属性和方法,支持代码复用。
多态同一接口在不同类中有不同实现(Python 通过鸭子类型实现)。
抽象定义抽象类和接口,强制子类实现特定方法。

二、类的详解

1. 构造方法 __init__
  • 初始化对象属性,创建对象时自动调用。
class Student:def __init__(self, name, score):self.name = nameself.score = scorestudent = Student("Alice", 90)
2. 实例属性 vs 类属性
  • 实例属性:属于对象,每个对象独立。
  • 类属性:属于类,所有对象共享。
class Car:wheels = 4  # 类属性def __init__(self, brand):self.brand = brand  # 实例属性car1 = Car("Toyota")
car2 = Car("BMW")
print(Car.wheels)  # 所有车都有 4 轮

3. 类方法与静态方法
  • 类方法:操作类属性,使用 @classmethod 装饰器,第一个参数为 cls
  • 静态方法:与类无关,使用 @staticmethod 装饰器。
class MyClass:class_attr = 0@classmethoddef increment_class_attr(cls):cls.class_attr += 1@staticmethoddef utility_method(a, b):return a + b

三、继承与多态

1. 单继承
class Animal:def speak(self):passclass Cat(Animal):def speak(self):  # 重写父类方法print("喵喵~")class Dog(Animal):def speak(self):print("汪汪!")animals = [Cat(), Dog()]
for animal in animals:animal.speak()  # 输出不同声音(多态)
2. 多继承与方法解析顺序(MRO)
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())  # 查看方法解析顺序

四、封装与访问控制

1. 私有属性与方法
  • 属性名以双下划线 __ 开头,会被自动重命名(名称修饰)。
class BankAccount:def __init__(self, balance):self.__balance = balance  # 私有属性def deposit(self, amount):if amount > 0:self.__balance += amountdef get_balance(self):  # 公开方法访问私有属性return self.__balanceaccount = BankAccount(1000)
# print(account.__balance)  # 报错
print(account.get_balance())  # 正确访问
2. 使用 @property 控制属性访问
class Circle:def __init__(self, radius):self._radius = radius@propertydef radius(self):  # Getterreturn self._radius@radius.setterdef radius(self, value):  # Setterif value > 0:self._radius = valueelse:raise ValueError("半径必须为正数")circle = Circle(5)
circle.radius = 10  # 通过 setter 赋值
print(circle.radius)  # 输出 10

五、高级主题

1. 抽象基类(ABC)
  • 使用 abc 模块定义抽象方法,强制子类实现。
from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2# shape = Shape()  # 报错,不能实例化抽象类
circle = Circle(5)
print(circle.area())  # 输出 78.5
2. 魔术方法(Magic Methods)
  • 通过实现特殊方法定制对象行为。
方法用途示例
__str__定义 print(obj) 的输出def __str__(self): return "Text"
__repr__定义解释器输出def __repr__(self): return "Obj"
__add__重载 + 运算符def __add__(self, other): ...
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)def __str__(self):return f"Vector({self.x}, {self.y})"v1 = Vector(2, 3)
v2 = Vector(1, 4)
v3 = v1 + v2
print(v3)  # 输出 Vector(3, 7)

六、实战案例

1. 简易电商系统

```python
class Product:def __init__(self, name, price):self.name = nameself.price = priceclass Cart:def __init__(self):self.items = []def add_item(self, product, quantity):self.items.append({"product": product, "quantity": quantity})def total_cost(self):return sum(item["product"].price * item["quantity"] for item in self.items)
http://www.xdnf.cn/news/644491.html

相关文章:

  • 前端常见的安全问题
  • 【监控】Node Exporter 介绍及应用
  • QT6安装与概念介绍
  • 30字速成Docker安装与配置指南
  • 【Web前端】ECMAScript 6基础学习
  • HTTP协议版本的发展(HTTP/0.9、1.0、1.1、2、3)
  • MySQL并发事务问题及隔离级别演示
  • 蓝桥杯单片机答题技巧
  • DNS 入门篇
  • Arduino Uno KY-037声音传感器实验
  • 短视频矩阵系统源码部署分享
  • 维护测试监控LLM应用
  • 从厨房到储物间:Grocy 家庭的智能物资管理助手
  • CA自签名证书创建--证书链生成脚本
  • dify-plugin-daemon的.env配置文件
  • 大模型和AI工具汇总(一)
  • CMake学习笔记(六)可以在CMake的function中修改function函数体之外的变量值吗?
  • 【FastAPI】--进阶教程1
  • VS2022 安装CodeGeeX AI插件实现高效编程体验
  • 贪心算法应用:贝尔曼-福特松弛问题详解
  • 差分数组知识笔记
  • 嵌入式学习笔记——day26
  • C++ gtest单元测试
  • STM32八股【10】-----stm32启动流程
  • 如何利用好cursor
  • 【第四十六周】文献阅读:从 RAG 到记忆:大型语言模型的非参数持续学习
  • c++ overwrite
  • 华为OD机试真题——仿LISP运算(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • Linux应用程序 栈溢出 内存踩踏 问题 排查学习
  • 第九课 影像文章插图及图表制作完全指南:从原理到应用