《Python面向对象编程指南》——1.10 一些其他的类定义
本节书摘来自异步社区《Python面向对象编程指南》一书中的第1章,第1.10节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.10 一些其他的类定义正如前面所提到的,玩家有两种策略:下注和打牌。每个Player实例会和模拟器进行很多交互。我们这里把这个模拟器命名为Table类。
Table类的职责需要配合Player实例完成以下事件。
玩家必须基于玩牌策略初始化一个牌局。 随后玩家会得到一手牌。 如果手中的牌是可以拆分的,玩家需要在基于当前玩法的情况下决定是否分牌。这会创建新的Hand对象。在一些场合中,新分出去的牌是可以再分的。 对于每个Hand实例,玩家必须基于当前玩法决定叫牌、双倍还是停叫。 然后玩家会收到账单,他们可以根据输赢情况来决定之后的游戏策略。基于以上需求,我们可以看出Table类需要提供一些API函数来获取牌局、创建Hand对象、分牌、提供单手和多手策略以及支付,这个对象的职责很多,用于追踪与Players集合所有相关操作的状态。
以下是Table类中投注和牌的逻辑处理的相关代码。
class Table: def __init__( self ): self.deck = Deck() def place_bet( self, amount ): print( "Bet", amount ) def get_hand( self ): try: self.hand= Hand2( d.pop(), d.pop(), d.pop() ) self.hole_card= d.pop() except IndexError: # Out of cards: need to shuffle. self.deck= Deck() return self.get_hand() print( "Deal", self.hand ) return self.hand def can_insure( self, hand ): return hand.dealer_card.insure
Table类会被Player类调用,从而接受牌局、创建Hand对象,然后决定手中的牌是否为保险下注。此外,还需要提供一些可以被Player类用来获取牌和支付的函数。
在get_hand()函数中的异常处理部分,并没有准确的模拟玩牌时的真实场景。这可能会导致统计不正确。更好的模拟方式是,在牌用尽的情况下需要新建一副牌并洗牌,而不是抛出异常。
为了更适当地交互设计并模拟真实的游戏场景,Player类需要一个下注策略。下注策略是一个状态对象,它决定了初始的下注级别,通常当每局游戏输赢之后可以再次选择不同的下注策略。
理想情况下,希望有多个下注策略对象。Python中有一个模块包含了很多装饰器,可以用来创建抽象基类。一种非正式的创建策略对象的方式是在基类函数中抛出异常,用以标识一些方法必须在子类中提供实现。
以下代码包含了一个抽象基类和一个子类,用来定义一种下注策略。
class BettingStrategy: def bet( self ): raise NotImplementedError( "No bet method" ) def record_win( self ): pass def record_loss( self ): pass class Flat(BettingStrategy): def bet( self ): return 1
基类中定义了带有默认返回值的方法。抽象基类中的bet()方法抛出异常,子类必须给出 bet()方法的实现。其他方法可以选择是否使用基类的默认实现。前面给出的游戏策略加上这个下注策略,可以模拟出Play类中更复杂的__init__()函数的使用场景。
我们可以使用abc模块来丰富抽象基类的实现,如以下代码段所示。
import abc class BettingStrategy2(meta >它有两个好处:首先,它阻止了对抽象基类BettingStrategy2的实例化,其次任何没有提供bet()方法实现的子类也是不能被实例化的。如果我们试图创建一个类的实例,而这个类并没有提供抽象方法的实现,程序就会抛出一个异常。
当然,如果基类的抽象方法提供了实现,那么就是合法的,而且可以通过super().bet()来调用。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Python正则表达式指南
- python安装python-lzf包,报错lzf_module.c:3:20: fatal error: Python.h: No such file or directory
- VS Code Python 全新发布
- Google Earth Engine python—— GEE中提取数据请求和 getThumbURL链接
- Python不香吗?你竟然要转行?
- python 装饰器详解
- 实战 | 如何用 Python 自动化监控文件夹完成服务部署
- Python中的字典
- 利用notepad++中安装python脚本实现批量转换文件编码
- caffe的python接口学习(4):mnist实例---手写数字识别
- 用python简单处理图片(2):图像通道几何变换裁剪
- 《Python数据科学指南》——1.22 列表排序
- 《Python面向对象编程指南》——1.3 在基类中实现init()方法
- 《Python面向对象编程指南》——1.13 总结
- 《Python面向对象编程指南》——2.10 总结
- 《Python编程初学者指南》—— 1.3 在Windows上设置Python
- 《Python编程初学者指南》——导读
- Python机器学习算法备忘单之5 种常见算法的快速参考指南
- python 判断数据类型及释疑
- python implementation for Qt's QDataStream(看一下QDataStream的结构)
- 《Python数据科学实践指南》——0.2 如何成为数据科学家
- 《Python数据科学实践指南》——0.3 为什么是Python
- 【Python】Python基础学习笔记
- 华为OD机试 - 选座位(Python) | 机试题+算法思路+考点+代码解析 【2023】
- 2022&2023华为OD机试 - 斗地主 2(Python)
- python 安装pycurl
- Python每日一学 01——输入输出