6.2 特殊方法示例
通过观察21点中的Hand对象,会发现有一个很有趣的关于包含关系的例子。我们常常会想知道玩家的手中是否有ace。如果我们用扩展list的方式来定义Hand,那么我们就不能直接查询是否有ace。取而代之的是,我们只能查询某张牌。我们不想写类似下面这样的代码。
any( card(1,suit) for suit in Suits )
这似乎是一种寻找ace的很麻烦的方法。
下面是一种更好的方法,但是,它或许还是有一些不够完美。
any( c.rank == 'A' for c in hand.cards )
所以,我们实际上只是想用下面这样的方法。
'A' in hand.cards
这意味着,我们试图修改list中对于“包含”的定义。我们并没有查询一个Card实例,我们只是在查询一个Card对象的rank属性。我们可以通过重写contains()方法实现。
def contains( self, rank ):
return any( c.rank==rank for rank in hand.cards )
这个实现让我们可以用一个简单的in在hand对象中查找给定的rank。
类似的设计也会用在iter()和len()这两个特殊方法中。但是,请注意,改变len()的语义和更改一个集合与for交互的方式可能是一个非常糟糕的设计。
