第一章 数据模型
数据模型其实是对 Python 框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。
Python 解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(例如 __ getitem )。比如 obj[key] 的背后就是 __ getitem __ 方法,为了能求得 my_collection[key] 的值,解释器实际上会调用 my_collection. getitem __(key)。
纸牌例子(展示__ getitem 和 len __ 这两个特殊方法)
其中关于collections标准库可以参考该博客
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46import collections import random # 新建一个只有少量属性的Card类(一张牌) 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() #初始化方法,_cards是私有变量 def __init__(self): self._cards=[Card(rank,suit) for rank in self.ranks for suit in self.suits] #长度 def __len__(self): # 通过内置函数来实现特殊方法是最好的选择,内置函数的速度很快 return len(self._cards) #实现了该方相当于对列表的操作都可在类上实现 def __getitem__(self, item): return self._cards[item] #在排序时为每一张牌定义权重 suit_values=dict(spades=3,hearts=2,diamonds=1,clubs=0) def spades_high(card): rank_value=FrenchDeck.ranks.index(card.rank) return rank_value*len(suit_values)+suit_values[card.suit] if __name__=='__main__': deck=FrenchDeck() # __len__方法 #print(len(deck)) # __getitem__方法 #print(deck[0]) #因为有了__getitem__方法,FrenchDeck可以直接被random.choice调用,来实现随机抽一张牌 #print(random.choice(deck)) #可以切片迭代 #print(deck[:3]) #对牌进行排序 #sorted函数输入可迭代对象和排序规则 for card in sorted(deck,key=spades_high): print(card)
在使用len()函数时,如果是 Python 内置的类型,比如列表(list)、字符串(str)、字节序列(bytearray)等,那么 CPython 会抄个近路,__ len __ 实际上会直接返回 PyVarObject 里的 ob_size 属性。PyVarObject 是表示内存中长度可变的内置对象的 C 语言结构体。直接读取这个值比调用一个方法要快很多。
python中在很多时候特殊方法的调用都是隐式的。
特殊方法:
运算符无关:
运算符有关:
最后
以上就是傻傻纸飞机最近收集整理的关于Fluent python 笔记及代码(1)第一章 数据模型的全部内容,更多相关Fluent内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复