Python 高级专用类方法的实例详解
发布时间 - 2026-01-11 03:11:57 点击率:次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
# 专用类
# Python 异常处理的实例详解
# 详解 Python 与文件对象共事的实例
# Python模拟用户登录验证
# python实现批量修改文件名代码
# python利用dir函数查看类中所有成员函数示例代码
# Python使用回溯法子集树模板解决爬楼梯问题示例
# Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
# 你可以
# 是一个
# 替你
# 让你
# 你要
# 你在
# 它可以
# 有一
# 如果你
# 在这个
# 将会
# 如有
# 才会
# 可以用
# 而不
# 希望能
# 我可
# 这样做
# 仅是
# 你已经
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在云主机上快速搭建多站点网站?
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
如何用景安虚拟主机手机版绑定域名建站?
高防服务器租用首荐平台,企业级优惠套餐快速部署
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
php结合redis实现高并发下的抢购、秒杀功能的实例
如何登录建站主机?访问步骤全解析
Laravel如何使用Eloquent进行子查询
大连 网站制作,大连天途有线官网?
JavaScript Ajax实现异步通信
微信推文制作网站有哪些,怎么做微信推文,急?
linux top下的 minerd 木马清除方法
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
青岛网站建设如何选择本地服务器?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Laravel如何优化应用性能?(缓存和优化命令)
利用vue写todolist单页应用
HTML 中如何正确使用模板变量为元素的 name 属性赋值
JavaScript如何实现错误处理_try...catch如何捕获异常?
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
如何快速搭建安全的FTP站点?
北京专业网站制作设计师招聘,北京白云观官方网站?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
,在苏州找工作,上哪个网站比较好?
如何快速生成橙子建站落地页链接?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel安装步骤详细教程_Laravel环境搭建指南
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
nginx修改上传文件大小限制的方法
如何实现javascript表单验证_正则表达式有哪些实用技巧
公司网站制作价格怎么算,公司办个官网需要多少钱?
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
Laravel如何集成Inertia.js与Vue/React?(安装配置)
网站制作报价单模板图片,小松挖机官方网站报价?
网站制作企业,网站的banner和导航栏是指什么?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
如何在新浪SAE免费搭建个人博客?
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Laravel API资源类怎么用_Laravel API Resource数据转换
敲碗10年!Mac系列传将迎来「触控与联网」双革新
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
香港服务器WordPress建站指南:SEO优化与高效部署策略
香港服务器部署网站为何提示未备案?
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
怎样使用JSON进行数据交换_它有什么限制
上一篇:服务器故障实例分析
上一篇:服务器故障实例分析

