[note]CardDeck

import collections
import random

Card = collections.namedtuple('Card', ["color","num"])

class Deck(object):
    nums = [str(i) for i in range(2,11)] + list("AJQK")
    colors = ["heart", "spade", "diamond", "club"]

    def __init__(self):
        self._cards = [Card(color,num) for color in Deck.colors for num in Deck.nums]

    def __getitem__(self, index):
        return self._cards[index]

    def __len__(self):
        return len(self._cards)



d = Deck()
print(d[0])
print(d[1])
print(d[51])
print(len(d))

for i in d:
    print(i)
print(d[1:5])

print(random.choice(d))
print(Card('heart','Q') in d)

def setitem(deck, index, card):
    deck._cards[index] = card

Deck.__setitem__ = setitem
random.shuffle(d)
  1. 在需要创建大量简单类(如Card,只有两个属性需要访问)的实例的时候,使用namedtuple十分直观,简洁。

  2. __len__方法为使用len()函数提供了依据。CPython中是如何实现len()函数的呢?
    实际上,在源码中,cpython的一切对象都源自于PyVarObject ,这其中有个变量ob_size。使用len()可以直接将它返回,更快。

  3. __getitem__方法的神奇之处在于:实现了这一方法后,实例对象可以用for迭代,可以用index访问,可以切片,还可以使用in判断是否存在,更甚者可以使用random.choice(),当然也可使用sorted或reversed.
    这是由于实现了__getitem__后python解释器,可以从index=0开始迭代,这就实现了iter的功能,同时,也可以从index=0开始扫描进而实现了in的功能。

  4. 但是没有__setitem__方法,实例不能完成random.shuffle().
    可以在类中进行补充,也可以动态绑定。
def setitem(deck, index, card):
    deck._cards[index] = card # 不能是deck[index]会形成无穷递归

 >>>Deck.__setitem__ = setitem # 类方法的绑定 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值