Practical Python项目:深入理解Python继承机制

Practical Python项目:深入理解Python继承机制

practical-python Practical Python Programming (course by @dabeaz) practical-python 项目地址: https://gitcode.com/gh_mirrors/pr/practical-python

继承基础概念

继承是面向对象编程的核心概念之一,它允许我们基于现有类创建新类。在Python中,继承的语法非常简单:

class Parent:
    pass

class Child(Parent):
    pass

在这个例子中,Child类继承自Parent类,Child被称为子类或派生类,Parent被称为父类或基类。

继承的三种主要用途

  1. 添加新方法:在子类中扩展父类的功能
  2. 重写方法:修改父类方法的行为
  3. 添加新属性:扩展实例的数据存储能力

添加新方法示例

class Stock:
    def __init__(self, name, shares, price):
        self.name = name
        self.shares = shares
        self.price = price

    def sell(self, nshares):
        self.shares -= nshares

class MyStock(Stock):
    def panic(self):
        self.sell(self.shares)  # 卖出所有股票

重写方法示例

class MyStock(Stock):
    def cost(self):
        return 1.25 * self.shares * self.price  # 增加25%的费用

super()函数的重要性

当我们需要在子类中调用父类的方法实现时,super()函数就派上用场了:

class MyStock(Stock):
    def cost(self):
        base_cost = super().cost()  # 调用父类的cost方法
        return 1.25 * base_cost

初始化方法与继承

在子类中重写__init__方法时,必须显式调用父类的初始化方法:

class MyStock(Stock):
    def __init__(self, name, shares, price, factor):
        super().__init__(name, shares, price)  # 调用父类初始化
        self.factor = factor  # 添加新属性

继承的实际应用:报表格式化

在Practical Python项目中,继承被用来实现报表的不同输出格式。这是一个典型的"框架"式设计:

  1. 定义抽象基类TableFormatter,规定接口规范
  2. 通过继承实现各种具体格式:
    • TextTableFormatter:纯文本格式
    • CSVTableFormatter:CSV格式
    • HTMLTableFormatter:HTML格式

抽象基类设计

class TableFormatter:
    def headings(self, headers):
        raise NotImplementedError()
    
    def row(self, rowdata):
        raise NotImplementedError()

具体实现示例

class TextTableFormatter(TableFormatter):
    def headings(self, headers):
        print(' '.join(f'{h:>10}' for h in headers))
        print(('-'*10 + ' ')*len(headers))
    
    def row(self, rowdata):
        print(' '.join(f'{d:>10}' for d in rowdata))

多态与工厂模式

为了更方便地使用不同的格式化器,项目还展示了工厂模式的实现:

def create_formatter(name):
    if name == 'txt':
        return TextTableFormatter()
    elif name == 'csv':
        return CSVTableFormatter()
    elif name == 'html':
        return HTMLTableFormatter()
    else:
        raise ValueError(f'Unknown format {name}')

这种设计使得客户端代码可以完全不用关心具体使用哪种格式化器,只需通过简单的名称指定即可。

继承的最佳实践

  1. 遵循Liskov替换原则:子类应该能够替换父类而不破坏程序功能
  2. 避免过度继承:过深的继承层次会使代码难以理解
  3. 优先组合而非继承:在不需要类型关系时,组合可能是更好的选择
  4. 明确继承关系:确保子类和父类之间有清晰的"is-a"关系

总结

通过Practical Python项目中的这个例子,我们可以看到继承如何用于创建可扩展、可维护的代码结构。特别是报表格式化器的实现,展示了如何通过继承来支持多种输出格式,同时保持代码的整洁和可扩展性。

理解这些概念对于构建大型Python应用程序至关重要,它们能帮助你设计出更灵活、更易于维护的代码架构。

practical-python Practical Python Programming (course by @dabeaz) practical-python 项目地址: https://gitcode.com/gh_mirrors/pr/practical-python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔或婵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值