虽然在处理重载运算符和命名元组时,我偶然发现了一些奇怪的行为,但由于某种原因:
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
并与作用于参数的事物(函数/运算符)的名称进行比较?
我很困惑,可能是因为我不知道这些事情究竟是如何运作的。
答案 0 :(得分:7)
从文档(强调我的):
math.floor(x)
返回
x
的最低限度,小于或等于x的最大整数。 如果x不是浮点数,则委托给x.__floor__()
,该值应返回积分值。