第一章 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 一個隨機選取的輪子