何时使用Python特殊方法?

时间:2010-03-11 20:20:36

标签: python

我知道类可以实现各种特殊方法,例如__iter____setitem____len____setattr__等等。但什么时候应该使用它们?任何人都可以描述我希望实现它们的典型场景,它们会简化Python中的编程吗?

谢谢,Boda Cydo。

4 个答案:

答案 0 :(得分:3)

嗯,简短的回答是:当你需要它们时

由于有许多内置函数我无法回答所有这些函数。但是,您几乎可以在不重写内置Python函数的情况下进行管理。

通常,当你需要它们时,你希望你的对象在Python中表现得像内置数据类型。例如,如果您希望能够运行

len(...)

在您的对象上(覆盖_____ len _____(...)),或比较两种数据类型的对象,如下所示:

obj1 < obj2

(覆盖_____ cmp _____(...))来做到这一点。

答案 1 :(得分:3)

我认为你基本上回答了你的问题。

熟悉特殊方法。如果您发现使用一个会使您的程序更简单,请使用它。如果你不明白它是为了什么,或者觉得它是一个更复杂的解决方案 - 你已经回答了这个问题。不要使用它。

典型的情况是:

  • 覆盖运营商

  • 捕获对不存在的属性的访问权并处理该访问权限(__getattr__

  • 操纵类和实例创建(__init____slots____new__

  • 自定义字符串表示形式(__str____repr__

  • 允许适销性(__call__

  • 挂钩方便/常用的内置语法(__getitem____len__等...)

这些内容主要涵盖在https://docs.python.org/reference/datamodel.html#specialnameshttp://docs.python.org/reference/datamodel.html#special-method-names

答案 2 :(得分:0)

如果您正在创建一个类似于数组或字典的类,这些非常有用,因此您的语法看起来很熟悉。例如,如果您想创建一个有序字典,您可以使用您提到的所有函数,以便可以将它与常规字典互换。

答案 3 :(得分:0)

当您希望通过委托实例成员而不是直接继承来实现接口时,

getattrsetattr非常有用。您将它们映射到该成员的getattrsetattr