Python面向对象学习分享

写代码的都知道,如果是大型的项目,基本都要用到面向对象,那什么是面向对象?

一、从一个生活场景说起

想象你要描述一只宠物狗:

传统方式(面向过程):

dog_name = "旺财"
dog_age = 3
dog_breed = "金毛"

def dog_bark(name):
    return f"{name}在汪汪叫!"

def dog_eat(name):
    return f"{name}在吃骨头"

每次操作这只狗,都要把它的数据和函数分开处理,有点麻烦对吧?

面向对象方式:

class Dog:
    def __init__(self, name, age, breed):
        self.name = name  # 名字
        self.age = age    # 年龄
        self.breed = breed # 品种
    
    def bark(self):
        return f"{self.name}在汪汪叫!"
    
    def eat(self):
        return f"{self.name}在吃骨头"

# 创建一只具体的狗
my_dog = Dog("旺财", 3, "金毛")
print(my_dog.bark())  # 旺财在汪汪叫!

发现区别了吗?面向对象把数据(名字、年龄)和行为(叫、吃)"打包"在一起了!

二、面向对象的四大法宝

1. 封装:把东西装进盒子

就像把手机、充电器、耳机都放进手机盒里:

class Student:
    def __init__(self, name, score):
        self.name = name
        self.__score = score  # 两个下划线开头,表示私有属性
    
    def show_info(self):
        return f"学生:{self.name}"
    
    def check_score(self):
        if self.__score >= 60:
            return "及格"
        else:
            return "不及格"

# 使用
xiaoming = Student("小明", 85)
print(xiaoming.show_info())  # ✅ 可以访问
print(xiaoming.check_score()) # ✅ 可以访问
print(xiaoming.__score)       # ❌ 会报错!不能直接看成绩

封装的优点:

  • 保护内部数据(比如不能随意修改成绩)
  • 简化使用(你只需要知道怎么用,不用知道内部细节)

2. 继承:子承父业

就像儿子可以继承父亲的特征:

# 父类(基类)
class Animal:
    def __init__(self, name):
        self.name = name
    
    def eat(self):
        return f"{self.name}在吃东西"

# 子类(派生类)
class Cat(Animal):  # 继承Animal类
    def meow(self):
        return f"{self.name}在喵喵叫"

class Fish(Animal):
    def swim(self):
        return f"{self.name}在游泳"

# 使用
kitty = Cat("小花")
print(kitty.eat())   # ✅ 继承自父类
print(kitty.meow())  # ✅ 自己的方法

nemo = Fish("尼莫")
print(nemo.eat())    # ✅ 继承自父类
print(nemo.swim())   # ✅ 自己的方法

3. 多态:同一种行为,不同表现

同样是"叫",但不同动物叫法不同:

class Bird(Animal):
    def speak(self):
        return f"{self.name}在叽叽喳喳"

class Dog(Animal):
    def speak(self):
        return f"{self.name}在汪汪叫"

# 多态的魅力
animals = [Bird("小黄"), Dog("小黑")]

for animal in animals:
    print(animal.speak())
# 输出:
# 小黄在叽叽喳喳
# 小黑在汪汪叫

同样的animal.speak(),但根据实际对象类型执行不同的方法。

4. 抽象:我只告诉你要做什么,不告诉你怎么做

就像开车,你知道踩油门能加速,但不需要知道发动机怎么工作:

from abc import ABC, abstractmethod

# 抽象类(不能直接创建实例)
class Shape(ABC):
    @abstractmethod
    def area(self):  # 抽象方法,只有定义没有实现
        pass
    
    @abstractmethod
    def perimeter(self):
        pass

# 具体实现
class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height
    
    def perimeter(self):
        return 2 * (self.width + self.height)

# 使用
rect = Rectangle(5, 3)
print(f"面积:{rect.area()}")  # 面积:15

三、实际应用:一个简单的银行账户系统

class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner  # 账户持有人
        self.__balance = balance  # 余额(私有属性)
    
    def deposit(self, amount):  # 存款
        if amount > 0:
            self.__balance += amount
            return f"存款成功!当前余额:{self.__balance}"
        return "存款金额必须大于0"
    
    def withdraw(self, amount):  # 取款
        if amount > self.__balance:
            return "余额不足"
        elif amount > 0:
            self.__balance -= amount
            return f"取款成功!当前余额:{self.__balance}"
        return "取款金额必须大于0"
    
    def check_balance(self):  # 查询余额
        return f"账户余额:{self.__balance}"

# 使用
my_account = BankAccount("张三", 1000)
print(my_account.deposit(500))    # 存款成功!当前余额:1500
print(my_account.withdraw(200))   # 取款成功!当前余额:1300
print(my_account.check_balance()) # 账户余额:1300

四、什么时候该用面向对象?

适合用面向对象的场景:

  1. 复杂系统,需要管理多个相关属性和行为
  2. 代码复用,多个对象有相似特征
  3. 团队协作,定义清晰的接口,各写各的部分
  4. GUI程序,窗口、按钮、菜单都是对象

不一定需要面向对象的场景:

  1. 简单脚本,只是处理几个数据文件
  2. 数学计算,纯计算任务
  3. 一次性任务,用完就扔的小工具

五、初学者常见误区

❌ 误区1:万物皆对象,所有代码都要OOP

# 过度设计(没必要)
class Calculator:
    def add(self, a, b):
        return a + b

calc = Calculator()
result = calc.add(1, 2)

# 简单点更好
def add(a, b):
    return a + b
result = add(1, 2)

❌ 误区2:过度使用继承

# 继承层次太深
class Animal:
    pass

class Mammal(Animal):
    pass

class Dog(Mammal):
    pass

class GoldenRetriever(Dog):
    pass

# 有时候组合更好
class Dog:
    def __init__(self, breed):
        self.breed = breed

class GoldenRetriever:
    def __init__(self):
        self.dog = Dog("金毛")  # 使用组合

六、小练习:做个简单的图书馆系统

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author
        self.is_borrowed = False
    
    def borrow(self):
        if not self.is_borrowed:
            self.is_borrowed = True
            return "借书成功"
        return "此书已被借出"
    
    def return_book(self):
        self.is_borrowed = False
        return "还书成功"

class Library:
    def __init__(self):
        self.books = []
    
    def add_book(self, book):
        self.books.append(book)
    
    def find_book(self, title):
        for book in self.books:
            if book.title == title:
                return book
        return None

# 测试
library = Library()
book1 = Book("Python入门", "张老师")
book2 = Book("算法导论", "李教授")

library.add_book(book1)
library.add_book(book2)

# 借书
found = library.find_book("Python入门")
if found:
    print(found.borrow())  # 借书成功

总结

面向对象就像整理房间:

  • 封装是把衣服放进衣柜(整理)
  • 继承是你的衣柜继承了父母衣柜的优点(遗传)
  • 多态是不同人打开衣柜做不同的事(多样)
  • 抽象是你知道衣柜能放衣服,但不关心内部结构(简化)

记住一个核心思想:

把相关的数据操作打包在一起,给它们一个"家"(类),然后创建具体的"家庭成员"(对象)。

刚开始可能觉得抽象,但用多了你会发现,生活中处处是对象:你的手机是一个对象,微信群是一个对象,美团订单也是一个对象。面向对象其实就是用代码模拟现实世界的一种方式。

多练习,从简单的类开始,慢慢你就会发现:原来面向对象这么简单!

posted @ 2026-01-15 09:02  深圳蔓延科技有限公司  阅读(3)  评论(0)    收藏  举报