Python重载不存在的运算符,为什么?

时间:2018-02-05 00:06:33

标签: python python-3.x operator-overloading operators overloading

虽然在处理重载运算符和命名元组时,我偶然发现了一些奇怪的行为,但由于某种原因:

https://repl.it/repls/RemorsefulFlawlessAfricanwildcat

import collections, math

Point = collections.namedtuple("Point", ["x", "y"])
Point.__floor__ = lambda self: Point(int(math.floor(self.x)), int(math.floor(self.y)))
print(math.floor(Point(1.4, -5.9)))
#prints: Point(x=1, y=-6)

有没有人对此有任何见解?它为什么有效?
如果我删除Point.__floor__行,则无效。

数学包是否在某处定义了__floor__运算符? OR
Python是否解析Point.__XXX__以提取XXX并与作用于参数的事物(函数/运算符)的名称进行比较?

我很困惑,可能是因为我不知道这些事情究竟是如何运作的。

1 个答案:

答案 0 :(得分:7)

从文档(强调我的):

  

math.floor(x)

     

返回x的最低限度,小于或等于x的最大整数。 如果x不是浮点数,则委托给x.__floor__() ,该值应返回积分值。