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中replace方法实例分析
Aug 20 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
Dec 09 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
wxPython的安装与使用教程
Aug 31 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 Python
pytorch中[..., 0]的用法说明
May 20 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
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
php实现无限级分类
2014/12/24 PHP
php中session定期自动清理的方法
2015/11/12 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
django中的ajax组件教程详解
2018/10/18 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
理解JavaScript中的事件
2006/09/23 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
实习生自荐信范文
2013/11/13 职场文书
劳资人员岗位职责
2013/12/19 职场文书
社区党建工作总结2015
2015/05/13 职场文书
小型婚礼主持词
2015/06/30 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
小学校本教研总结
2015/08/13 职场文书
如何利用golang运用mysql数据库
2022/03/13 Golang