2024-04-19 11:37:15 发布
网友
什么时候应该直接调用__dunder__方法?例如
__dunder__
a + b
一个人可以写
a.__add__(b)
但这是个好主意吗?你知道吗
Is a.__add__(b) a good idea?
读起来容易吗?可能不会。所以,一般来说不是个好主意。你知道吗
但是,有一种情况是,当您编写子类时,需要调用父类上的a方法。你知道吗
一般来说,不,这不是个好主意。操作符的存在毕竟是有原因的,所以当可以使用操作符时,就使用它。你知道吗
在一些情况下,直接调用特殊方法是有用的。最常见的事情是子类化。因此,当您重写一个特殊的方法并希望同时调用super的方法时,您必须直接使用这个名称。你知道吗
除此之外,拥有实际的方法允许您保留对它的引用,即x = a.__add__。所以当你需要这样的东西时,你可以用它。当然,对于基运算符,它也没有那么有用,因为我们有operator模块,它已经为运算符提供了二进制函数。你知道吗
x = a.__add__
operator
但可能有一些边缘案例。不过,一般来说:如果您不明确地需要方法,请使用操作符。更清楚了。你知道吗
martijnpieters在评论中提到了另一个用例,即避免调用inverse操作符。您可能知道,表达式a + b将首先尝试调用a.__add__(b)。如果返回特殊值NotImplemented,或者换句话说,如果操作符不是由a类型实现的,那么Python将尝试调用b.__radd__(a)(如果b是另一种类型)。因此,如果您想避免这种行为,您可以直接调用a.__add__(b),此时您将得到一个NotImplemented值。你知道吗
NotImplemented
a
b.__radd__(a)
b
是的!我可以想到几个用例:
链接到超类实现:
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__
不过,一般来说,运算符更简单、更清晰。你知道吗
读起来容易吗?可能不会。所以,一般来说不是个好主意。你知道吗
但是,有一种情况是,当您编写子类时,需要调用父类上的a方法。你知道吗
一般来说,不,这不是个好主意。操作符的存在毕竟是有原因的,所以当可以使用操作符时,就使用它。你知道吗
在一些情况下,直接调用特殊方法是有用的。最常见的事情是子类化。因此,当您重写一个特殊的方法并希望同时调用super的方法时,您必须直接使用这个名称。你知道吗
除此之外,拥有实际的方法允许您保留对它的引用,即
x = a.__add__
。所以当你需要这样的东西时,你可以用它。当然,对于基运算符,它也没有那么有用,因为我们有operator
模块,它已经为运算符提供了二进制函数。你知道吗但可能有一些边缘案例。不过,一般来说:如果您不明确地需要方法,请使用操作符。更清楚了。你知道吗
martijnpieters在评论中提到了另一个用例,即避免调用inverse操作符。您可能知道,表达式
a + b
将首先尝试调用a.__add__(b)
。如果返回特殊值NotImplemented
,或者换句话说,如果操作符不是由a
类型实现的,那么Python将尝试调用b.__radd__(a)
(如果b
是另一种类型)。因此,如果您想避免这种行为,您可以直接调用a.__add__(b)
,此时您将得到一个NotImplemented
值。你知道吗是的!我可以想到几个用例:
链接到超类实现:
调用超类实现以避免重写方法:
当运算符不可用时调用dunder方法:
Currying运算符:
不过,一般来说,运算符更简单、更清晰。你知道吗
相关问题 更多 >
编程相关推荐