下载工作台
Python 编程实战

面向对象编程

试读上半部分 · 解锁后可读全文

第 6 章 · 面向对象

本章目标:理解类与对象实例属性方法;掌握 __init__、封装与 @property;了解继承super();能建模 shop-demoProductCartuser-demoUser;区分类属性与实例属性。

学时建议: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操作实例数据
@classmethodcls工厂方法、访问类属性
@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

以下内容需解锁后阅读

试读已结束。解锁本章 ¥5.00,或开通年度会员畅读全部教程。
年度会员 ¥199.00/年; 小紫 AI 工作台有效会员 ¥99.00/年

正文仅在服务端鉴权后下发,未付费无法获取下半部分内容。