《Python面向对象编程指南》——1.6 在每个子类中实现__init()__方法

简介:

本节书摘来自异步社区《Python面向对象编程指南》一书中的第1章,第1.6节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.6 在每个子类中实现__init()__方法

正如介绍工厂函数那样,这里我们也先看一些Card类的设计实例。我们可以考虑重构rank数值转换的代码,并把这个功能加在Card类上。这样就可以把初始化的工作分发到每个子类来完成。

这通常需要在基类中完成一些公共的初始化逻辑,子类中完成各自特殊的初始化逻辑。我们需要遵守不要重复自己(Don't Repeat Yourself,DRY)的原则来防止子类中的代码重复。

以下代码演示了如何把初始化职责分发到各自的子类中。

class Card:
  pass
class NumberCard( Card ):
  def __init__( self, rank, suit ):
    self.suit= suit
    self.rank= str(rank)
    self.hard = self.soft = rank
class AceCard( Card ):
  def __init__( self, rank, suit ):
    self.suit= suit
    self.rank= "A"
    self.hard, self.soft = 1, 11
class FaceCard( Card ):
  def __init__( self, rank, suit ):
    self.suit= suit
    self.rank= {11: 'J', 12: 'Q', 13: 'K' }[rank]
    self.hard = self.soft = 1

上例代码是多态的实现,由于缺乏公共初始化函数,导致了一些不受欢迎的重复代码。以上代码的主要重复部分是对suit的赋值。这部分代码放在基类中显然比较合适。我们可以在子类中显式调用基类的__init()__方法。

以下代码演示了如何把__init()__方法提到基类Card中实现的过程,然后在子类中可以重用基类的实现。

class Card:
  def __init__( self, rank, suit, hard, soft ):
    self.rank= rank
    self.suit= suit
    self.hard= hard
    self.soft= soft
class NumberCard( Card ):
  def __init__( self, rank, suit ):
    super().__init__( str(rank), suit, rank, rank )
class AceCard( Card ):
  def __init__( self, rank, suit ):
    super().__init__( "A", suit, 1, 11 )
class FaceCard( Card ):
  def __init__( self, rank, suit ):
    super().__init__( {11: 'J', 12: 'Q', 13: 'K' }[rank], suit, 
10, 10 )

我们在子类和基类中都提供了__init()__方法的实现,这样会在一定程度上简化工厂函数的逻辑,如下面代码段所示。

def card10( rank, suit ):
  if rank == 1: return AceCard( rank, suit )
  elif 2 <= rank < 11: return NumberCard( rank, suit )
  elif 11 <= rank < 14: return FaceCard( rank, suit )
  else:
    raise Exception( "Rank out of range" )

仅仅是简化工厂函数不应该是我们重构焦点的全部。我们还应该看到这次的重构导致__init()__方法变得复杂了,做这样的权衡是正常的。


427ae76760c51a7d2c3df4d834a823687fe00a2a
相关文章
|
2月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
315 1
|
3月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
124 2
|
3月前
|
调度 Python
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
113 0
|
3月前
|
传感器 大数据 API
Python数字限制在指定范围内:方法与实践
在Python编程中,限制数字范围是常见需求,如游戏属性控制、金融计算和数据过滤等场景。本文介绍了五种主流方法:基础条件判断、数学运算、装饰器模式、类封装及NumPy数组处理,分别适用于不同复杂度和性能要求的场景。每种方法均有示例代码和适用情况说明,帮助开发者根据实际需求选择最优方案。
184 0
|
3月前
|
Python
Python字符串center()方法详解 - 实现字符串居中对齐的完整指南
Python的`center()`方法用于将字符串居中,并通过指定宽度和填充字符美化输出格式,常用于文本对齐、标题及表格设计。
|
2月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
378 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
3月前
|
机器学习/深度学习 数据采集 算法
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
244 4
|
2月前
|
算法 调度 决策智能
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
|
3月前
|
机器学习/深度学习 数据采集 TensorFlow
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
144 0
|
4月前
|
数据管理 开发工具 索引
在Python中借助Everything工具实现高效文件搜索的方法
使用上述方法,你就能在Python中利用Everything的强大搜索能力实现快速的文件搜索,这对于需要在大量文件中进行快速查找的场景尤其有用。此外,利用Python脚本可以灵活地将这一功能集成到更复杂的应用程序中,增强了自动化处理和数据管理的能力。
329 0

推荐镜像

更多
下一篇
oss云网关配置