第 6 章 · 面向对象
本章目标:理解类与对象、实例属性与方法;掌握 __init__、封装与 @property;了解继承与 super();能建模 shop-demo 的 Product、Cart 与 user-demo 的 User;区分类属性与实例属性。
学时建议:4~5 小时(含 1.5 小时跟练)
前置:ch05 函数与模块。
6.1 类与对象
class Product:
"""商品(教学模型)。"""
def __init__(self, sku: str, title: str, price: float, stock: int = 0):
self.sku = sku
self.title = title
self.price = price
self.stock = stock
def is_available(self) -> bool:
return self.stock > 0
def __repr__(self):
return f"<Product {self.sku} {self.title!r}>"
book = Product("BK-001", "Python 基础", 59.9, stock=10)
print(book.is_available())
| 概念 | 说明 |
|---|---|
类 class | 对象的蓝图 |
| 实例 | 由类创建的具体对象 |
self | 实例方法的第一个参数,指向当前对象 |
__init__ | 构造/初始化方法 |
6.2 实例属性与类属性
class ShopConfig:
shop_name = "shop-demo" # 类属性,所有实例共享
tax_rate = 0.06
def __init__(self, branch: str):
self.branch = branch # 实例属性
a = ShopConfig("城东店")
b = ShopConfig("城西店")
print(a.shop_name, b.shop_name) # shop-demo shop-demo
修改类属性会影响所有实例(除非实例自己有同名属性遮蔽)。
ShopConfig.tax_rate = 0.08
6.3 方法种类
class Cart:
def __init__(self):
self._lines = [] # 约定:单下划线表示「内部使用」
def add(self, product: Product, qty: int = 1):
if qty <= 0:
raise ValueError("数量须为正")
if product.stock < qty:
raise ValueError("库存不足")
self._lines.append((product, qty))
def total(self) -> float:
return sum(p.price * q for p, q in self._lines)
@classmethod
def from_items(cls, items):
"""类方法:替代构造器。"""
cart = cls()
for product, qty in items:
cart.add(product, qty)
return cart
@staticmethod
def format_money(amount: float) -> str:
return f"¥{amount:.2f}"
| 装饰器 | 第一个参数 | 典型用途 |
|---|---|---|
| 实例方法 | self | 操作实例数据 |
@classmethod | cls | 工厂方法、访问类属性 |
@staticmethod | 无 | 与类相关但不依赖实例/类状态 |
6.4 封装与 @property
class User:
def __init__(self, user_id: str, nickname: str, balance: float = 0.0):
self.user_id = user_id
self.nickname = nickname
self._balance = balance
@property
def balance(self) -> float:
return self._balance
def deposit(self, amount: float):
if amount <= 0:
raise ValueError("充值金额须为正")
self._balance += amount
def pay(self, amount: float) -> bool:
if amount > self._balance:
return False
self._balance -= amount
return True
| 方式 | 说明 |
|---|---|
_attr | 约定私有,仍可访问 |
@property | 只读或受控读写 |
@balance.setter | 可写属性(选修) |
6.5 继承与 super()
class Animal:
def speak(self):
return "..."
class Dog(Animal):
def speak(self):
return "汪汪"
class MemberUser(User):
MEMBER_DISCOUNT = 0.95