Dav*_*ave 5 python operator-overloading division
使用python的V3,我创建:
class NewInt(int):
def __rtruediv__(self, num):
print('in here')
x = NewInt(5)
343 / x # called rtruediv as I expect, but
343.3 / x # does not call rtruediv
Run Code Online (Sandbox Code Playgroud)
不知道为什么这是因为:
x / 343
x / 343.3 #both will call truediv
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎不一致..
任何人都可以解释为什么会这样……当 Python 执行 343.3 / x 时,是否有可以覆盖的方法?
我在查看有关过载的一些信息时发现了这种行为,并遇到了这种不一致的情况。
戴夫
简而言之,左操作数首先处理操作,除非在某些特殊情况下。
这里的相关文档是模拟数字类型:
注意:如果右操作数的类型是左操作数类型的子类,并且该子类为操作提供反射方法,则该方法将在左操作数的非反射方法之前调用。此行为允许子类覆盖其祖先的操作。
所以在以下情况下:
343.3 / x # does not call __rtruediv__
Run Code Online (Sandbox Code Playgroud)
左手获胜,因为float除法int被定义,并且NewInt 是一个n int。那是,343.3.__truediv__(x)成功没有错误。
让我们根据文档协调所有四种情况,看看这里没有任何不一致的行为:
343 / x # x.__rtruediv__ wins because NewInt subclasses int
343.3 / x # 343.3.__truediv__ wins because NewInt doesn't subclass float
x / 343 # x.__truediv__ wins because int doesn't subclass NewInt
x / 343.3 # x.__truediv__ wins because float doesn't subclass NewInt
Run Code Online (Sandbox Code Playgroud)
__rtruediv____truediv__仅当右侧操作数是左侧操作数类的子类的实例时才具有优先级。
当您这样做时343 / x,NewInt是 的子类int,因此 x__rtruediv__具有优先权。当您这样做时343.3 / x,NewInt不是 的子类float,因此 343.3__truediv__具有优先权。
343.3.__truediv__(x)不返回NotImplemented,因为float知道如何将 float 除以 int 。因此,x.__rtruediv__不会被调用。