当前位置:首页>python>Python面向对象学习分享

Python面向对象学习分享

  • 2026-10-23 15:09:36
Python面向对象学习分享

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

一、从一个生活场景说起

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

传统方式(面向过程):

dog_name = "旺财"dog_age = 3dog_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))    # 存款成功!当前余额:1500print(my_account.withdraw(200))   # 取款成功!当前余额:1300print(my_account.check_balance()) # 账户余额:1300

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

适合用面向对象的场景:

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

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

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

五、初学者常见误区

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

# 过度设计(没必要)class Calculator:    def add(self, a, b):        return a + bcalc = Calculator()result = calc.add(1, 2)# 简单点更好def add(a, b):    return a + bresult = add(1, 2)

❌ 误区2:过度使用继承

# 继承层次太深class Animal:    passclass Mammal(Animal):    passclass Dog(Mammal):    passclass GoldenRetriever(Dog):    pass# 有时候组合更好class Dog:    def __init__(self, breed):        self.breed = breedclass 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())  # 借书成功

总结

面向对象就像整理房间:

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

记住一个核心思想:

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

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

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

最新文章

随机文章