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解析XML的几种常见方法的介绍
Apr 09 Python
Python网站验证码识别
Jan 25 Python
python实现二维码扫码自动登录淘宝
Dec 27 Python
Python基于matplotlib绘制栈式直方图的方法示例
Aug 09 Python
Python+OpenCV实现车牌字符分割和识别
Mar 31 Python
python实现多人聊天室
Mar 31 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 Python
Python实现CNN的多通道输入实例
Jan 17 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 Python
教你利用Selenium+python自动化来解决pip使用异常
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中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
python3图片文件批量重命名处理
2019/10/31 Python
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
CSS3 简写animation
2012/05/10 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
班组长安全职责
2014/01/05 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
幼儿园教师培训方案
2014/02/04 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
英文演讲稿开场白
2014/08/25 职场文书
2014年终个人工作总结
2014/11/07 职场文书
优秀护士事迹材料
2014/12/25 职场文书
大学学生会辞职信
2015/05/13 职场文书
签字仪式主持词
2015/07/03 职场文书
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python
java实现web实时消息推送的七种方案
2022/07/23 Java/Android