Python 高级专用类方法的实例详解


Posted in Python onSeptember 11, 2017

Python 高级专用类方法的实例详解

除了 __getitem__ 和 __setitem__ 之外 Python 还有更多的专用函数。某些可以让你模拟出你甚至可能不知道的功能。下面的例子将展示 UserDict 一些其他专用方法。

def __repr__(self): return repr(self.data)   (1) 
def __cmp__(self, dict):            (2) 
  if isinstance(dict, UserDict):       
    return cmp(self.data, dict.data)    
  else:                    
    return cmp(self.data, dict)       
def __len__(self): return len(self.data)    (3) 
def __delitem__(self, key): del self.data[key] (4)

(1)  __repr__ 是一个专用的方法,在当调用 repr(instance) 时被调用。repr 函数是一个内置函数,它返回一个对象的字符串表示。它可以用在任何对象上,不仅仅是类的实例。你已经对 repr 相当熟悉了,尽管你不知道它。在交互式窗口中,当你只敲入一个变量名,接着按 ENTER,Python 使用 repr 来显示变量的值。自已用一些数据来创建一个字典 d ,然后用 print repr(d) 来看一看吧。

(2)  __cmp__ 在比较类实例时被调用。通常,你可以通过使用 == 比较任意两个 Python 对象,不只是类实例。有一些规则,定义了何时内置数据类型被认为是相等的,例如,字典在有着全部相同的关键字和值时是相等的。对于类实例,你可以定义 __cmp__ 方法,自已编写比较逻辑,然后你可以使用 == 来比较你的类,Python 将会替你调用你的 __cmp__ 专用方法。

(3)  __len__ 在调用 len(instance) 时被调用。len 是一个内置函数,可以返回一个对象的长度。它可以用于任何被认为理应有长度的对象。字符串的 len 是它的字符个数;字典的 len 是它的关键字的个数;列表或序列的 len 是元素的个数。对于类实例,定义 __len__ 方法,接着自已编写长度的计算,然后调用 len(instance),Python 将替你调用你的 __len__ 专用方法。

(4)  __delitem__ 在调用 del instance[key] 时调用 ,你可能记得它作为从字典中删除单个元素的方法。当你在类实例中使用 del 时,Python 替你调用 __delitem__ 专用方法。

Note: Python v s. Java equality  and i dentity

在 Java 中,通过使用 str1 == str2 可以确定两个字符串变量是否指向同一块物理内存位置。这叫做对象同一性,在 Python 中写为 str1 is str2。在 Java 中要比较两个字符串值,你要使用 str1.equals(str2);在 Python 中,你要使用 str1 == str2。某些 Java 程序员,他们已经被教授得认为,正是因为在 Java 中 == 是通过同一性而不是值进行比较,所以世界才会更美好。这些人要接受 Python 的这个“严重缺失”可能要花些时间。

在这个地方,你可能会想,“所有这些工作只是为了在类中做一些我可以对一个内置数据类型所做的操作”。不错,如果你能够从像字典一样的内置数据类型进行继承的话,事情就容易多了 (那样整个 UserDict 类将完全不需要了)。尽管你可以这样做,专用方法仍然是有用的,因为它们可以用于任何的类,而不只是像 UserDict 这样的封装类。

专用方法意味着任何类 可以像字典一样保存键-值对,只要定义 __setitem__ 方法。任何类可以表现得像一个序列,只要定义 __getitem__ 方法。任何定义了 __cmp__ 方法的类可以用 == 进行比较。并且如果你的类表现为拥有类似长度的东西,不要定义 GetLength 方法,而定义 __len__ 方法,并使用 len(instance)。

Note:

其它的面向对象语言仅让你定义一个对象的物理模型 (“这个对象有 GetLength 方法”),而 Python 的专用类方法像 __len__ 允许你定义一个对象的逻辑模型 (“这个对象有一个长度”)

Python 存在许多其它的专用方法。有一整套的专用方法,可以让类表现得象数值一样,允许你在类实例上进行加、减,以及执行其它算数操作。(关于这一点典型的例子就是表示复数的类,数值带有实数和虚数部分。) __call__ 方法让一个类表现得像一个函数,允许你直接调用一个类实例。并且存在其它的专用函数,允许类拥有只读或只写数据属性,在后面的章节中我们会更多地谈到这些。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python实现的检测网站挂马程序
Nov 30 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
Apr 09 Python
python 3利用BeautifulSoup抓取div标签的方法示例
May 28 Python
Python 自动化表单提交实例代码
Jun 08 Python
python http接口自动化脚本详解
Jan 02 Python
python实现对求解最长回文子串的动态规划算法
Jun 02 Python
python实现彩色图转换成灰度图
Jan 15 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
python实现简单图书管理系统
Nov 22 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
Jun 15 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 Python
Python 异常处理的实例详解
Sep 11 #Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 #Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 #Python
详解 Python 与文件对象共事的实例
Sep 11 #Python
Python 私有函数的实例详解
Sep 11 #Python
Python模拟用户登录验证
Sep 11 #Python
Python模拟三级菜单效果
Sep 11 #Python
You might like
初探PHP5
2006/10/09 PHP
php中{}大括号是什么意思
2013/12/01 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
python实现给数组按片赋值的方法
2015/07/28 Python
python实现文本文件合并
2015/12/29 Python
Python格式化日期时间操作示例
2018/06/28 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
在django模板中实现超链接配置
2019/08/21 Python
python实现画出e指数函数的图像
2019/11/21 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
东方通信股份有限公司VC面试题
2014/08/27 面试题
城市创卫标语
2014/06/17 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
单位接收函范文
2015/01/30 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书