第一章 python数据类型
1 隐式方法
利用collections.namedtuple 快速生成字典
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]
1.1 __getitem__方法
deck = FrenchDeck()
>>> deck[0]
Card(rank='2', suit='spades')
>>> deck[-1]
Card(rank='A', suit='hearts')
__getitem__方法
- 通过下标找元素
- 自动支持切片(slicing)操作
- 可迭代
1.2 __len__方法 与 len(my_object)
- 如果my_object 是一个自定义类的对象,那么 Python 会自己去调用其中由 你实现的 len 方法。
- Python 内置的类型,比如列表(list)、字符串(str)、 字节序列(bytearray)等,那么 CPython
会抄个近路,__len__ 实际 上会直接返回 PyVarObject 里的 ob_size 属性。
1.3 其他方法 特殊方法的调用是隐式的
for i in x: 这个语句
背后其实用的是 iter(x)
而这个函数的背后则是 x.__iter__() 方法。
1.4 不要自己想当然地随意添加特殊方法
比如 foo 之类的
因为虽然现在这个名字没有被 Python 内部使用,以后就不一定了
一个轮子 随机抽牌
>>> from random import choice
>>> choice(deck)
Card(rank='3', suit='hearts')
>>> choice(deck)
Card(rank='K', suit='spades')
>>> choice(deck)
Card(rank='2', suit='clubs')
2 字符串表示形式 repr 和 str
- __repr__和__str__这两个方法都是用于显示的
- __str__是面向用户的,而__repr__面向程序员。
- 一个对象没有 str 函数,解释器会用 repr 作为替代。
3 算术运算符
add 和 __mul__,类带来了 + 和 * 这两个算
术运算符。
4 布尔值
- 列表项目bool(x) 的背后是调用x.__bool__() 的结果;
- 如果不存在 bool 方法,那么 bool(x) 会尝试调用 x.__len__()。
- 若返回 0,则 bool 会返回 False;否则返回True。
5 其他隐式方法请见 书1.3 特殊方法一览
小总结
- collections.namedtuple 快速生成字典
- __getitem__方法
- 通过下标找元素
- 自动支持切片(slicing)操作
- 可迭代
len()
- len(my_obj )自定义类的对象,自定义实现的 len 方法。
- python内置类型,通过内部类型的属性直接取得
repr__和__str
- __repr__和__str__这两个方法都是用于显示的
- __str__是面向用户的,而__repr__面向程序员。
- 一个对象没有 str 函数,解释器会用 repr 作为替代。
- from random import choice 一个随机选取的轮子