什么时候应该直接调用方法?

2024-04-19 11:37:15 发布

您现在位置:Python中文网/ 问答频道 /正文

什么时候应该直接调用__dunder__方法?例如

a + b

一个人可以写

a.__add__(b)

但这是个好主意吗?你知道吗


Tags: 方法add主意dunder
3条回答

Is a.__add__(b) a good idea?

读起来容易吗?可能不会。所以,一般来说不是个好主意。你知道吗

但是,有一种情况是,当您编写子类时,需要调用父类上的a方法。你知道吗

一般来说,不,这不是个好主意。操作符的存在毕竟是有原因的,所以当可以使用操作符时,就使用它。你知道吗

在一些情况下,直接调用特殊方法是有用的。最常见的事情是子类化。因此,当您重写一个特殊的方法并希望同时调用super的方法时,您必须直接使用这个名称。你知道吗

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

但可能有一些边缘案例。不过,一般来说:如果您不明确地需要方法,请使用操作符。更清楚了。你知道吗

martijnpieters在评论中提到了另一个用例,即避免调用inverse操作符。您可能知道,表达式a + b将首先尝试调用a.__add__(b)。如果返回特殊值NotImplemented,或者换句话说,如果操作符不是由a类型实现的,那么Python将尝试调用b.__radd__(a)(如果b是另一种类型)。因此,如果您想避免这种行为,您可以直接调用a.__add__(b),此时您将得到一个NotImplemented值。你知道吗

是的!我可以想到几个用例:

  • 链接到超类实现:

    def __init__(self, ...):
        super().__init__(self, ...)
    
  • 调用超类实现以避免重写方法:

    def __getattribute__(self, ...):
        ...
    def foo(self, ...):
        x = super().__getattribute__(self, 'bar')
    
  • 当运算符不可用时调用dunder方法:

    for scls in cls.__subclasses__():
        ...
    
  • Currying运算符:

    mulByTen = (10).__mul__
    

不过,一般来说,运算符更简单、更清晰。你知道吗

相关问题 更多 >