《Python面向对象编程指南》——1.3 在基类中实现init()方法

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

1.3 在基类中实现init()方法

通过实现__init()__方法来初始化一个对象。每当创建一个对象,Python会先创建一个空对象,然后调用该对象的__init()__函数。这个方法提供了对象内部变量以及其他一些一次性过程的初始化操作。

以下是关于一个Card类层次结构定义的一些例子。这里定义了一个基类和3个子类来描述Card类的基本信息。有两个变量是参数直接赋值的,另外两个参数是通过初始化方法计算来完成初始化的。

class Card:
  def __init__( self, rank, suit ):
    self.suit= suit
    self.rank= rank
    self.hard, self.soft = self._points()
class NumberCard( Card ):
  def _points( self ):
    return int(self.rank), int(self.rank)
class AceCard( Card ):
  def _points( self ):
    return 1, 11
class FaceCard( Card ):
  def _points( self ):
    return 10, 10

在以上代码段中,__init()__把公共初始化方法引入到了基类Card中,这样3个子类NumberCard、AceCard和FaceCard都能够共享公共的初始化逻辑。

这是一个常见的多态设计,每个子类为_points()方法提供特有的实现。所有的子类有相同的方法名和属性。这3个子类在使用时可以通过互换对象来更换实现方式。

如果只是简单地使用字母来定义花色,就可以使用如下的代码段来创建Card对象。

cards = [ AceCard('A', ''), NumberCard('2',''), NumberCard('3',''), ]

这里枚举了Card集合中的几个Card对象,把牌面值(rank)和花色(suit)作为参数传入来实例化。从长远来看,需要一个更智能的工厂函数来创建Card对象,因为枚举所有52张牌非常麻烦而且容易出错。在介绍工厂函数前,先看一些其他的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值