Python:rtruediv 没有按我的预期工作

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 时,是否有可以覆盖的方法?

我在查看有关过载的一些信息时发现了这种行为,并遇到了这种不一致的情况。

戴夫

wim*_*wim 6

简而言之,左操作数首先处理操作,除非在某些特殊情况下。

这里的相关文档是模拟数字类型

注意:如果右操作数的类型是左操作数类型的子类,并且该子类为操作提供反射方法,则该方法将在左操作数的非反射方法之前调用。此行为允许子类覆盖其祖先的操作。

所以在以下情况下:

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)


use*_*ica 5

__rtruediv____truediv__仅当右侧操作数是左侧操作数类的子类的实例时才具有优先级。

当您这样做时343 / xNewInt是 的子类int,因此 x__rtruediv__具有优先权。当您这样做时343.3 / xNewInt不是 的子类float,因此 343.3__truediv__具有优先权。

343.3.__truediv__(x)不返回NotImplemented,因为float知道如何将 float 除以 int 。因此,x.__rtruediv__不会被调用。