资讯专栏INFORMATION COLUMN

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

tomener / 1664人阅读

摘要:第一章数据类型隐式方法利用快速生成类方法方法通过下标找元素自动支持切片操作可迭代方法与如果是一个自定义类的对象,那么会自己去调用其中由你实现的方法。若返回,则会返回否则返回。一个对象没有函数,解释器会用作为替代。

第一章 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 一个随机选取的轮子

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41541.html

相关文章

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

    摘要:第一章数据类型隐式方法利用快速生成字典方法方法通过下标找元素自动支持切片操作可迭代方法与如果是一个自定义类的对象,那么会自己去调用其中由你实现的方法。若返回,则会返回否则返回。一个对象没有函数,解释器会用作为替代。 第一章 python数据类型 1 隐式方法 利用collections.namedtuple 快速生成字典 import collections Card = coll...

    FullStackDeveloper 评论0 收藏0
  • 流畅python读书笔记-第十章-序列修改、散列和切片

    摘要:例如,的序列协议只需要和两个方法。任何类如,只要使用标准的签名和语义实现了这两个方法,就能用在任何期待序列的地方。方法开放了内置序列实现的棘手逻辑,用于优雅地处理缺失索引和负数索引,以及长度超过目标序列的切片。 序列的修改、散列和切片 接着造Vector2d类 要达到的要求 为了编写Vector(3, 4) 和 Vector(3, 4, 5) 这样的代码,我们可以让 init 法接受任...

    cpupro 评论0 收藏0
  • 流畅python读书笔记-第九章-符合Python风格对象

    摘要:以便于用户理解的方式返回对象的字符串表示形式。函数会调用函数,对来说,输出的是一个有序对。此外,还有用于支持内置的构造函数的方法。可散列实现了方法,使用推荐的异或运算符计算实例属性的散列值私有属性最好用命名规则来实现这种方式有好有坏 绝对不要使用两个前导下划线,这是很烦人的自私行为。——Ian Bicking 对象表示形式 repr()  以便于开发者理解的方式返回对象的字符串表示形式...

    fai1017 评论0 收藏0
  • 【Java并发编程艺术】一章读书笔记

    摘要:前言并发编程的目的是让程序跑的更快,但并不是启动更多的线程,这个程序就跑的更快。尽可能降低上下文切换的次数,有助于提高并发效率。死锁并发编程中的另一挑战是死锁,会造成系统功能不可用。 前言 并发编程的目的是让程序跑的更快,但并不是启动更多的线程,这个程序就跑的更快。有以下几种挑战。 挑战及方案 上下文切换 单核CPU上执行多线程任务,通过给每个线程分配CPU时间片的方式来实现这个机制。...

    马忠志 评论0 收藏0
  • Python 面向对象编程指南 读书笔记

    摘要:可以赋值对象的生命周期主要是有创建初始化销毁。显示而非隐式对于每个方法,都应当显示的制定要初始化的变量。每当创建一个对象,会创建一个空对象,然后调用该对象的函数,提供了初始化的操作。以点为例作为说明。 第一部分 用特殊方法实现Python风格的类 为了实现更好的可扩展性,Python语言提供了大量的特殊方法,它们大致分为以下几类。 特性访问 可调用对象 集合 数字 上下文 迭代器 ...

    cncoder 评论0 收藏0

发表评论

0条评论

tomener

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<