前言
标准库doctest
测试驱动开发:先写测试,推动开发
obj[key]实际调用实例的__getitem__方法
python数据模型
特殊方法
特殊方法一般自己定义,供py解释器调用,不推荐自己手动调用。
对于py内置类型,调用特殊方法时,cython可能会直接从c结构获取字段值,免去了py特殊方法调用,加快方法耗时,比如求py内置类型列表或元组等len时,会调对象__len__方法,该方法会调PyVarObject的ob_size属性
特殊方法调用:大部分是隐式调用。len(obj)会调用 obj.__len__, for i in obj 会调用iter(obj),然后会调用obj.__iter__方法
__repr__和__str__
调用print(obj)或显示调用str(obj)时会调用__str__
直接obj时回显是__repr__的
__bool__
if obj时,会调用obj.__bool__,如果obj没有__bool__方法,则调用obj.__len__,如果返回0则False,返回非0则True
纸牌类
定义
__len__方法注意不要len(self),会形成无限循环
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
class FrenchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
def __len__(self):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position]
随机抽牌
可用random.choice方法
可迭代
仅实现__getitem__方法后,实例就变成可迭代了
洗牌
对象不可变,如果添加__setitem__方法,则可洗牌,