Python 专用类方法详解:从内置行为到自定义逻辑
本文深入解析 Python 中的专用类方法,通过 UserDict 实例展示 __repr__、__cmp__、__len__ 及 __delitem__ 的具体应用。文章对比了 Python 与 Java 在对象比较上的差异,阐述了如何通过定义专用方法使自定义类具备内置数据类型的行为特征,如字符串表示、逻辑比较、长度计算及元素删除,帮助开发者理解 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 与 Java 的相等性与同一性对比
在 Java 中,通过使用 str1 == str2 可以确定两个字符串变量是否指向同一块物理内存位置。这叫做对象同一性(identity),在 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__ 方法让一个类表现得像一个函数,允许你直接调用一个类实例。并且存在其它的专用函数,允许类拥有只读或只写数据属性,在后面的章节中我们会更多地谈到这些。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













