概述
Python解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(如__getitem__),obj[key]背后就是__getitem__方法,调用obj.__getitem__(key)。
这些特殊方法(双下方法)能让自己的对象实现和支持下面的语言架构,并与之交互:
- 迭代
- 集合类
- 属性访问
- 运算符重载
- 函数和方法的调用
- 对象的创建和销毁
- 字符串表示形式和格式化
- 管理上下文(with块)
一摞Python风格的纸牌
import collections
#collections.namedtuple用以构建只有少数属性但是没有方法的的对象
Card=collections.namedtuple('Card',['rank','suit'])
#>>> card=Card('7','diamonds')
#>>> card
#Card(rank='7', suit='diamonds')
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]
对于FrenchDeck这个类,deck = FrenchDeck(),可以使用len(deck)看一看长度,deck[0]来获取值,还可以方便地利用Python标准库,比如:
>>> from random import choice
>>> choice(deck)
Card(rank='3', suit='hearts')
因为__getitem__方法把[]操作交给了self._cards列表,所以deck类自动支持切片操作和迭代:
>>> deck[:3]
>>> for card in deck:
...
print(card)
>>> for card in reversed(deck): #反向迭代
...
print(card)
迭代通常是隐式的,譬如一个集合类型没有实现__contians__方法,那么in运算符就会按顺序做一次迭代搜索。( __contains__(self, item) 当调用 in 和 not in 来测试成员是否存在时候 __contains__ 被定义。)
根据花色和点数进行排序:
suit_values=dict(spades=3,hearts=2,diamonds=1,clubs=0)
def spades_high(card):
rank_value=FrenchDeck.ranks.index(card.rank) #对rank属性的排序
return rank_value*len(suit_values)+suit_values[card.suit]
根据spades_high函数,进行升序排序:
for card in sorted(deck,key=spades_high):
print card
最后
以上就是顺利帽子为你收集整理的Fluent Python读书笔记(一)的全部内容,希望文章能够帮你解决Fluent Python读书笔记(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复