流畅的python读书笔记-第一章Python 数据模型

第一章 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)

  1. 如果my_object 是一个自定义类的对象,那么 Python 会自己去调用其中由 你实现的 len 方法。
  2. 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 字符串表示形式 reprstr

  • __repr__和__str__这两个方法都是用于显示的
  • __str__是面向用户的,而__repr__面向程序员。
  • 一个对象没有 str 函数,解释器会用 repr 作为替代。

3 算术运算符

add 和 __mul__,类带来了 + 和 * 这两个算
术运算符。

4 布尔值

  1. 列表项目bool(x) 的背后是调用x.__bool__() 的结果;
  2. 如果不存在 bool 方法,那么 bool(x) 会尝试调用 x.__len__()。
  3. 若返回 0,则 bool 会返回 False;否则返回True。

5 其他隐式方法请见 书1.3 特殊方法一览

小总结

    1. collections.namedtuple 快速生成字典
    2. __getitem__方法
    • 通过下标找元素
    • 自动支持切片(slicing)操作
    • 可迭代
    1. len()

      • len(my_obj )自定义类的对象,自定义实现的 len 方法。
      • python内置类型,通过内部类型的属性直接取得
    2. repr__和__str

      • __repr__和__str__这两个方法都是用于显示的
      • __str__是面向用户的,而__repr__面向程序员。
      • 一个对象没有 str 函数,解释器会用 repr 作为替代。
    3. from random import choice 一个随机选取的轮子
        原文作者:little_liang
        原文地址: https://segmentfault.com/a/1190000014355460
        本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
    点赞