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
四、什么时候该用面向对象?
适合用面向对象的场景:
- 复杂系统,需要管理多个相关属性和行为
- 代码复用,多个对象有相似特征
- 团队协作,定义清晰的接口,各写各的部分
- GUI程序,窗口、按钮、菜单都是对象
不一定需要面向对象的场景:
- 简单脚本,只是处理几个数据文件
- 数学计算,纯计算任务
- 一次性任务,用完就扔的小工具
五、初学者常见误区
❌ 误区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()) # 借书成功
总结
面向对象就像整理房间:
- 封装是把衣服放进衣柜(整理)
- 继承是你的衣柜继承了父母衣柜的优点(遗传)
- 多态是不同人打开衣柜做不同的事(多样)
- 抽象是你知道衣柜能放衣服,但不关心内部结构(简化)
记住一个核心思想:
把相关的数据和操作打包在一起,给它们一个"家"(类),然后创建具体的"家庭成员"(对象)。
刚开始可能觉得抽象,但用多了你会发现,生活中处处是对象:你的手机是一个对象,微信群是一个对象,美团订单也是一个对象。面向对象其实就是用代码模拟现实世界的一种方式。
多练习,从简单的类开始,慢慢你就会发现:原来面向对象这么简单!

浙公网安备 33010602011771号