数据模型
python数据模型是对python框架的描述,主要内容就是python特殊方法的使用
通过使用特殊方法,我们使自己定义的对象能够被一些函数所支持
意思就是说在自定义的类中实现了某些特殊方法,
- 那么类的实例对象就可以直接调用python的一些内置函数,如len()
- 使类的对象变成了python内置对象,如序列对象
例子:
import collections
Card = collections.namedtuple('Card', ['suit', 'rank'])
class Deck:
ranks = [str(rank) for rank in range(2, 11)] + 'JQKA'
suits = '黑桃 红桃 方片 梅花'.split()
def __init__(self):
self._cards = [Card(suit,rank) for suit in suits for rank in ranks]
def __len__(self):
return len(self._cards)
def __getitem__(self, item):
return self._cards[item]
上面的Deck类实现了特殊方法len和getitem,那么在使用Deck类的对象时,可以直接使用序列数据类型所能使用的所有方法,实现了这两个特殊方法,就可以认为Deck类就是一个序列数据类型
如:
deck = Deck()
print(len(deck))
print(deck[0])
print(Card('黑桃', 7) in deck)
还有特殊方法repr,实现了这个特殊方法,那么对象可以直接被print打印出来,也就是实现了repr特殊方法的类的对象可以用字符串的形式被表达出来
如:
class Demo:
def __init__(self):
pass
def __repr__(self):
return 'Demo'
d = Demo()
print(d) #这里打印的结果不是object之类的,而是字符串Demo
小结
- 特殊方法的存在是为了被python解释器调用的
- 调用len(),背后实际上是调用了obj.__ len __,也就是说由解释器去调用
- 调用print(xxx),实际上是调用了__ repr __
- 特殊方法基本是隐式调用的,如for i in x,背后实际上是调用了iter(x),而iter(x)背后又调用了x.__ iter __
- 如果是python内置类型,如列表list、字符串str、字节序列bytearray等等,那么CPython会抄个近路,直接读取内置对象的C语言结构体,直接读取一个值比调用一个方法速度要快得多