当程序越来越复杂,“一堆零散变量 + 函数”会越来越难管。面向对象(OOP)把“数据”和“操作数据的方法”打包成类,让我们像搭积木一样组织大系统。这一章讲类与实例、封装、继承、多态,并用一个“图书管理”小系统落到实处。
class Student:
def __init__(self, name, score): # 构造方法:创建时自动调用
self.name = name
self.score = score
def level(self): # 方法:附着在实例上的函数
return "优秀" if self.score >= 90 else "加油"
s = Student("张三", 92) # 用类“造”一个实例
print(s.name, s.level()) # 张三 优秀
再举一个生活化例子:每只宠物都是一个实例,调用方法就“自我介绍”。
class Pet:
def __init__(self, name, kind):
self.name = name
self.kind = kind
def introduce(self):
return f"我是{self.kind} {self.name}"
cat = Pet("咪咪", "猫")
dog = Pet("旺财", "狗")
print(cat.introduce())
print(dog.introduce())
贴近真实项目:把“商品”也做成一个类,状态(库存)与方法(购买)绑在一起,方便在购物车 / 库存系统里复用。
class Product:
def __init__(self, name, price, stock):
self.name = name
self.price = price
self.stock = stock
def buy(self, n):
if n <= self.stock:
self.stock -= n
return f"购买{n}件{self.name},单价{self.price}元"
return "库存不足"
p = Product("笔记本", 5, 3)
print(p.buy(2))
print("剩余库存:", p.stock)
class Account:
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # 双下划线:私有,外部不能直接改
def deposit(self, n):
if n > 0:
self.__balance += n
def get_balance(self):
return self.__balance
a = Account("李四", 100)
a.deposit(50)
print(a.get_balance()) # 150
# a.__balance = 9999 # 这样改不了,保护数据
生活化例子:用单下划线标记“内部属性”,通过方法去读和改。
class Person:
def __init__(self, name, age):
self.name = name
self._age = age # 单下划线:约定“别随便改”
def get_age(self):
return self._age
def grow(self):
self._age += 1
p = Person("小明", 10)
p.grow()
print(p.name, "今年", p.get_age(), "岁")
贴近真实项目:注册用户用双下划线保护密码,只允许通过受控方法设置与校验。
class User:
def __init__(self, username):
self.username = username
self.__password = None # 双下划线“私有”
def set_password(self, pwd):
if len(pwd) >= 6:
self.__password = pwd
return "密码设置成功"
return "密码太短,至少 6 位"
def login(self, pwd):
return pwd == self.__password
u = User("admin")
print(u.set_password("123"))
print(u.set_password("abc123"))
print(u.login("abc123"))
print(u.login("wrong"))
class Animal:
def speak(self):
return "..."
class Dog(Animal): # 继承 Animal
def speak(self): # 重写(多态)
return "汪汪"
class Cat(Animal):
def speak(self):
return "喵喵"
for a in [Dog(), Cat()]:
print(a.speak()) # 同一调用,不同表现
生活化例子:员工是基类,经理 / 实习生继承并重写 work(),多态统一调用。
class Employee:
def __init__(self, name):
self.name = name
def work(self):
return f"{self.name} 在工作"
class Manager(Employee):
def work(self):
return f"{self.name} 在开会安排任务"
class Intern(Employee):
def work(self):
return f"{self.name} 在帮忙打杂"
for e in [Manager("王总"), Intern("小李"), Employee("小张")]:
print(e.work())
贴近真实项目:承接章末“图书管理”,把 Book 当作基类,纸质书 / 有声书各自重写 read()。
class Book:
def __init__(self, title):
self.title = title
def read(self):
return f"读《{self.title}》"
class PaperBook(Book):
def read(self):
return f"翻开《{self.title}》纸质书阅读"
class AudioBook(Book):
def read(self):
return f"播放《{self.title}》有声书"
for b in [PaperBook("Python 编程"), AudioBook("数据结构"), Book("未分类")]:
print(b.read())
把前面零散的概念收进一个可运行的小系统:Book 类封装一本书,Library 管理多本书的增删与查询。
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
self.borrowed = False
def borrow(self):
if not self.borrowed:
self.borrowed = True
return f"《{self.title}》借出成功"
return "已被借走"
class Library:
def __init__(self):
self.books = []
def add(self, book):
self.books.append(book)
def list_available(self):
return [b.title for b in self.books if not b.borrowed]
lib = Library()
lib.add(Book("Python 编程", "张三"))
lib.add(Book("数据结构", "李四"))
print("可借:", lib.list_available())
print(lib.books[0].borrow())
print("借后剩余可借:", lib.list_available())
1定义一个基类 Shape,其 area() 返回 0;再定义子类 Circle(r) 和 Square(side),分别重写 area() 计算面积(圆面积用 3.14 × r²,注意用 round(x, 2) 处理小数)。最后把它们放进一个列表,循环调用 area() 并打印结果。
提示:子类在 __init__ 里记下半径 / 边长,area() 里返回计算结果;浮点结果用 round(..., 2) 固定两位小数。
class Shape:
def area(self):
return 0
class Circle(Shape):
def __init__(self, r):
self.r = r
def area(self):
return round(3.14 * self.r * self.r, 2)
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side * self.side
for s in [Circle(2), Square(5), Circle(1)]:
print(type(s).__name__, "面积:", s.area())