流暢的python讀書筆記-第一章Python 數據模型

第一章 python數據類型

1 隱式方法

利用collections.namedtuple 快速生成類python

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__方法

  1. 經過下標找元素
  2. 自動支持切片(slicing)操做
  3. 可迭代

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__() 方法。dom

1.4 不要本身想固然地隨意添加特殊方法

好比 foo 之類的
由於雖然如今這個名字沒有被 Python 內部使用,之後就不必定了函數

一個輪子 隨機抽牌ui

>>> 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__方法

  1. 經過下標找元素
  2. 自動支持切片(slicing)操做
  3. 可迭代

len()

  1. len(my_obj )自定義類的對象,自定義實現的 len 方法。
  2. python內置類型,經過內部類型的屬性直接取得

repr__和__str

  1. __repr__和__str__這兩個方法都是用於顯示的
  2. __str__是面向用戶的,而__repr__面向程序員。
  3. 一個對象沒有 str 函數,解釋器會用 repr 做爲替代。

from random import choice 一個隨機選取的輪子

相關文章
相關標籤/搜索