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在windows下创建隐藏窗口子进程的方法
Jun 04 Python
Python的组合模式与责任链模式编程示例
Feb 02 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
对python xlrd读取datetime类型数据的方法详解
Dec 26 Python
利用Python代码实现一键抠背景功能
Dec 29 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
浅谈Python中的字符串
Jun 10 Python
python中线程和进程有何区别
Jun 17 Python
python基于selenium爬取斗鱼弹幕
Feb 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/04/12 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
Use Word to Search for Files
2007/06/15 Javascript
基于Jquery的简单&简陋Tabs插件代码
2010/02/09 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
js取得url地址参数实例
2013/02/22 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
pytorch构建多模型实例
2020/01/15 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
利用python进行文件操作
2020/12/04 Python
数学专业推荐信范文
2013/11/21 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
法制宣传标语
2014/06/23 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
分析设计模式之模板方法Java实现
2021/06/23 Java/Android