Python 高级专用类方法的实例详解
Python高级专用类方法的实例详解
除了__getitem__和__setitem__之外Python还有更多的专用函数。某些可以让你模拟出你甚至可能不知道的功能。下面的例子将展示UserDict一些其他专用方法。
def__repr__(self):returnrepr(self.data)(1) def__cmp__(self,dict):(2) ifisinstance(dict,UserDict): returncmp(self.data,dict.data) else: returncmp(self.data,dict) def__len__(self):returnlen(self.data)(3) def__delitem__(self,key):delself.data[key](4)
(1) __repr__是一个专用的方法,在当调用repr(instance)时被调用。repr函数是一个内置函数,它返回一个对象的字符串表示。它可以用在任何对象上,不仅仅是类的实例。你已经对repr相当熟悉了,尽管你不知道它。在交互式窗口中,当你只敲入一个变量名,接着按ENTER,Python使用repr来显示变量的值。自已用一些数据来创建一个字典d,然后用printrepr(d)来看一看吧。
(2) __cmp__在比较类实例时被调用。通常,你可以通过使用==比较任意两个Python对象,不只是类实例。有一些规则,定义了何时内置数据类型被认为是相等的,例如,字典在有着全部相同的关键字和值时是相等的。对于类实例,你可以定义__cmp__方法,自已编写比较逻辑,然后你可以使用==来比较你的类,Python将会替你调用你的__cmp__专用方法。
(3) __len__在调用len(instance)时被调用。len是一个内置函数,可以返回一个对象的长度。它可以用于任何被认为理应有长度的对象。字符串的len是它的字符个数;字典的len是它的关键字的个数;列表或序列的len是元素的个数。对于类实例,定义__len__方法,接着自已编写长度的计算,然后调用len(instance),Python将替你调用你的__len__专用方法。
(4) __delitem__在调用delinstance[key]时调用,你可能记得它作为从字典中删除单个元素的方法。当你在类实例中使用del时,Python替你调用__delitem__专用方法。
Note:Pythonvs.Javaequality andidentity
在Java中,通过使用str1==str2可以确定两个字符串变量是否指向同一块物理内存位置。这叫做对象同一性,在Python中写为str1isstr2。在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__方法让一个类表现得像一个函数,允许你直接调用一个类实例。并且存在其它的专用函数,允许类拥有只读或只写数据属性,在后面的章节中我们会更多地谈到这些。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!