什么时候应该直接调用__method__?

Eth*_*man 2 python methods python-3.x

应该何时__dunder__直接调用方法?例如,而不是

a + b
Run Code Online (Sandbox Code Playgroud)

一个人可以写

a.__add__(b)
Run Code Online (Sandbox Code Playgroud)

但这是个好主意吗?

pok*_*oke 6

总的来说,不,这不是一个好主意.毕竟操作员是有原因的,所以当使用操作员时,可以使用它.

有一些事情直接调用特殊方法是有用的.最常见的是子类化时.因此,当您覆盖特殊方法并且您也想要调用super方法时,您将不得不直接使用该名称.

除此之外,使用实际方法可以保持对它的引用,即x = a.__add__.所以当你需要这样的东西时,你可以使用它.当然,对于基本运算符来说它也没那么有用,因为我们已经operator为运算符提供了二进制函数的模块.

但可能存在一些边缘情况.一般情况下:如果您没有明确需要该方法,请使用运算符.它更加清晰.

Martijn Pieters在评论中提到了另一个用例,即避免调用inverse运算符.您可能知道,表达式a + b将首先尝试调用a.__add__(b).如果返回特殊值NotImplemented,或者换句话说,如果运算符没有按类型实现a,那么Python将尝试调用b.__radd__(a)(如果b是不同的类型).因此,在您想要避免此行为的情况下,您可以a.__add__(b)直接调用- 此时您将获得一个NotImplemented值.

  • 嗯,我也不能在2.7上工作; 记忆失火然后.子类反向操作前向操作符钩子[在数据模型文档中记录](https://docs.python.org/2/reference/datamodel.html#object.__radd__)(参见注释块).它只适用于未继承子类`.__ radd__`的情况. (2认同)