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

 更新时间:2017年09月11日 11:36:55   投稿:lqh  
这篇文章主要介绍了Python 高级专用类方法的实例详解的相关资料,希望通过本文大家能够掌握这部分内容,需要的朋友可以参考下

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 Plotly绘图工具的简单使用

    python Plotly绘图工具的简单使用

    这篇文章主要介绍了python Plotly绘图工具的简单使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Python实现剪刀石头布小游戏(与电脑对战)

    Python实现剪刀石头布小游戏(与电脑对战)

    这篇文章给大家分享Python基础实现与电脑对战的剪刀石头布小游戏,练习if while输入和输出,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-12-12
  • python中的*与**用法示例详解

    python中的*与**用法示例详解

    这篇文章主要介绍了python中*与**用法的相关资料,Python中的*和**用于数值计算、序列解包、函数定义和调用,*用于乘法和解包序列,**用于乘方、解包字典和扩展字典,需要的朋友可以参考下
    2025-01-01
  • Python 无限级分类树状结构生成算法的实现

    Python 无限级分类树状结构生成算法的实现

    这篇文章主要介绍了Python 无限级分类树状结构生成算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python更换pip源方法过程解析

    Python更换pip源方法过程解析

    这篇文章主要介绍了Python更换pip源方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 利用PyQt5生成过年春联

    利用PyQt5生成过年春联

    这篇文章主要介绍了如何利用PyQt5生成过年春联。通过在界面上输入春联的上、下批和横批汉字从而生成春联图像,最后将春联图片保存。需要的可以参考一下
    2022-01-01
  • python中查找excel某一列的重复数据 剔除之后打印

    python中查找excel某一列的重复数据 剔除之后打印

    python查找excel某一列的重复数据,剔除之后打印,供大家学习参考
    2013-02-02
  • 详解用python写网络爬虫-爬取新浪微博评论

    详解用python写网络爬虫-爬取新浪微博评论

    这篇文章主要介绍了python爬取新浪微博评论,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)

    python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)

    这篇文章主要介绍了python+pygame实现坦克大战小游戏---可以自定义子弹速度,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 基于python编写一个简单的压力测试(DDoS)脚本

    基于python编写一个简单的压力测试(DDoS)脚本

    这篇文章主要为大家详细介绍了如何基于python编写一个简单的压力测试(DDoS)脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2024-12-12

最新评论