首先不要脸的放上个人网站:www.comingnext.cn

1.关于数据模型

在Python的官方文档中是这样说的:

对象是Python对数据的抽象。Python程序中所有数据都由对象或对象之间的关系表示。在某种意义上,为了和冯诺依曼存储程序计算机模型保持一致,代码和数据一样也是一个对象(冯诺依曼模型中提到,数据和程序都以0,1存储于存储器中)

简单的说,Python中的一切数据要么是对象,要么和对象有关系

如果你带着来自其他面向对象语言的经验进入 Python 的世界,会对 len(object) 而不是 object.len() 写法觉得不适。但是它体现了Python的一种设计思想,也是pythonic的关键所在,而这种思想则体现在Python的数据模型中。

数据模型其实是对 Python 框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。

2.特殊方法(魔术方法)

不管在哪种框架下写程序,都会花费大量时间去实现那些会被框架本身调用的方法, Python 也不例外。

Python 解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(例如 __ getitem__ )。比如 obj[key] 的背后就是 __getitem__ 方法,为了能求得 my_collection[key] 的值,解释器实际上会调用 my_collection._getitem_(key)。 魔术方法(magic method)是特殊方法的昵称。特殊方法也叫双下方法(dunder method)。

通过实现特殊方法,自定义数据类型可以表现得跟内置类型一样,从而让我们写出更具表达力的代码——或者说,更具 Python 风格的代码。例如下面的一段代码:

 1 import collections
 2
 3 Card = collections.namedtuple('Card', ['rank', 'suit'])
 4
 5 class FrenchDeck:
 6     ranks = [str(n) for n in range(2, 11)] + list('JQKA')
 7     suits = 'spades diamonds clubs hearts'.split()
 8
 9     def __init__(self):
10         self._cards = [Card(rank, suit) for suit in self.suits
11                                         for rank in self.ranks]
12
13     def __len__(self):
14         return len(self._cards)
15
16     def __getitem__(self, position):
17         return self._cards[position]

这段代码是一副扑克牌的原型,在这个自定义类中,有三个我们写的特殊方法,通过这几个方法,我们的自定义类就可以在使用的时候像Python的内置类型一样。 我们把这段代码保存为frenchdeck.py文件,然后通过命令行窗口进入该文件所在目录,这里用的是Python3,Python2应该也可以使用。

进入Python shell后如下:

Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from frenchdeck import *
>>> deck = FrenchDeck()
>>> len(deck)
52
>>> deck[0]
Card(rank='2', suit='spades')
>>> deck[-1]
Card(rank='A', suit='hearts')
>>>

通过上面的这个例子,我们可以看到,当我们在使用len(deck)和deck[0]时,Python的解释器实际上分别调用了我们在自定义类中的__len__和__getitem__这两个方法。

然后,假如我们现在要在这一副“扑克牌”中,随机的抽取出一张牌,我们要怎么做呢?自己在写一个方法吗?这在Python中是不用的,Python 已经内置了从一个序列中随机选出一个元素的函数 random.choice,我们直接把它用在这一摞纸牌实例上就好(解释器代码接上面):

>>> 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')

通过上面的两个例子,我们已经可以体会到通过实现特殊方法来利用 Python 数据模型的两个好处:

1.作为你的类的用户,他们不必去记住标准操作的各式名称(“怎么得到元素的总数?是 .size() 还是 .length() 还是别的什么?”)。

2.可以更加方便地利用 Python 的标准库,比如 random.choice 函数,从而不用重新发明轮子。

同时,我们也能了解到,这些特殊方法的调用,通常都是隐式的,首先明确一点,特殊方法的存在是为了被 Python 解释器调用的,你自己并不需要调用它们。也就是说没有 my_object.__len__() 这种写法,而应该使用 len(my_object)。在执行 len(my_object) 的时候,如果 my_object 是一个自定义类的对象,那么 Python 会自己去调用其中由你实现的 __len__ 方法。通过内置的函数(例如 len、iter、str,等等)来使用特殊方法是最好的选择。这些内置函数不仅会调用特殊方法,通常还提供额外的好处,而且对于内置的类来说,它们的速度更快。

Python 数据模型的特殊方法还有很多,想要了解更多的关于Python数据模型和特殊方法的内容,可以参见:https://docs.python.org/3/reference/datamodel.html,是最符合规范的Python知识来源。

转载于:https://www.cnblogs.com/zivwong/p/7381256.html

Python学习笔记1:数据模型和特殊方法(魔术方法)相关推荐

  1. python学习笔记(三)—— 序列类型及方法(列表、元组、字符串)

    所谓序列,指的是一块可以存放多个值的连续内存空间,可以通过每个值所在的编号(索引)去访问他们 目录 列表(可变序列) 元组(不可变序列) 字符串(不可变) 转义 字符串拼接 列表(可变序列) 列表 方 ...

  2. Python学习笔记——os模块【文件、目录方法】

    例子 train_data_path = os.path.join(data_path, 'npy/') 解释:os.path.join(path,name)  连接目录和文件名或目录 ls = os ...

  3. Python学习笔记Task11.魔法方法

    Python学习笔记Task11.魔法方法 魔法方法格式__init__ 1.基本 init(self[,-]) new(cls[,-]) del(self) str(self) repr(self) ...

  4. 2016April Python学习笔记(pandasecharts)

    2016April Python学习笔记 Git学习 git(/ɡɪt/,关于这个音频文件 音频(帮助·信息))是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2 ...

  5. Python学习笔记19:列表 III

    Python学习笔记19:列表 III 其实这篇笔记标题应该是列表扩展,从列表开始,将涵盖Python中的序列容器. 关于列表的基础知识,可以看我的前两篇文章: Python学习笔记1:列表. Pyt ...

  6. [python教程入门学习]python学习笔记(CMD执行文件并传入参数)

    本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  7. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  8. Python学习笔记(二):标准流与重定向

    Python学习笔记(二):标准流与重定向 - SamWei - 博客园 Python学习笔记(二):标准流与重定向 Posted on 2012-02-19 22:36 SamWei 阅读(176) ...

  9. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  10. python基本语法语句-python学习笔记:基本语法

    原标题:python学习笔记:基本语法 缩进:必须使用4个空格来表示每级缩进,支持Tab字符 if语句,经常与else, elif(相当于else if) 配合使用. for语句,迭代器,依次处理迭代 ...

最新文章

  1. SPI的原理以及Verilog HDL实现
  2. ListView自动滚到底部
  3. 软件测试工具按用途分分为哪几类,以测试的形态分软件测试可以分为哪几类?...
  4. Xcode8 消除部分警告
  5. NLP面试时,项目经历要怎么讲?
  6. Mozilla官方:Firefox 3.5.1问题并非安全漏洞 仅是堆溢出Crash
  7. XAF Study Recources
  8. 第2课:关闭被黑客扫描的端口
  9. php购票排位_PHP基于双向链表与排序操作实现的会员排名功能示例
  10. mssql 事务的一个例子
  11. [转载] python:numpy数学函数和逻辑函数
  12. python 防破解_Python 程序员如何防止数据被修改?
  13. Kotlin — 在一个项目中混用 Java 与 Kotlin(混合开发)
  14. 开源中国开源世界高峰论坛
  15. python常用的软件有哪些_Python编程常用软件有哪些?
  16. HTTPS为什么安全 分析 HTTPS 连接建立全过程
  17. datagrip连接sqlserve发生[08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接
  18. HT366 具有防破音功能的2×20W立体声D类音频功放IC
  19. 物业智能化管理西方行政学说
  20. C++ Boost库:简介和第一个示例程序

热门文章

  1. Android Studio中快捷键实现try catch等功能包含代码块
  2. nginx强制刷新用户缓存_HTTP 缓存
  3. python 原理 pdf_《深入浅出深度学习:原理剖析与Python实践》.pdf
  4. python pyecharts 折线图_Python数据可视化之pyecharts实现各种图表
  5. Java 去除重复数据的五种方式
  6. 云主机安mysql_如何在云服务器 ECS 安装 MySQL
  7. 2019年工程造价表_【行业要闻】中国建设工程造价管理协会 关于2019年工程造价咨询企业造价咨询收入排名的公告...
  8. eclipse经常高占用_高可用系统的设计指南
  9. 机器学习算法汇总:人工神经网络、深度学习及其它
  10. html网页设计课程的思维导图,UI设计初级教程学哪些?课程大纲和思维导图分享给你!...