Python __floordiv__ 方法
最后修改于 2025 年 4 月 8 日
本综合指南探讨了 Python 的 __floordiv__ 方法,这是一个实现地板除法(// 运算符)的特殊方法。我们将介绍基本用法、运算符重载、自定义数值类型和实际示例。
基本定义
__floordiv__ 方法是一个特殊方法,它在 Python 中实现地板除法运算 (//)。 当在两个对象之间使用 // 运算符时,会调用它。
主要特征:它必须返回地板除法结果,可以为任何类定义,并且如果需要,应该处理类型转换。 相应的反射操作是 __rfloordiv__。
基本的 __floordiv__ 实现
这是一个简单的实现,展示了 __floordiv__ 如何与自定义类一起工作。 这演示了基本的运算符重载模式。
class Number:
def __init__(self, value):
self.value = value
def __floordiv__(self, other):
if isinstance(other, Number):
return Number(self.value // other.value)
elif isinstance(other, (int, float)):
return Number(self.value // other)
else:
return NotImplemented
a = Number(10)
b = Number(3)
result = a // b
print(result.value) # Output: 3
此示例显示了一个实现地板除法的基本 Number 类。 该方法处理除以另一个 Number 或一个常规数字,并返回一个包含结果的新 Number 实例。
NotImplemented 返回值告诉 Python,如果给定类型不支持该操作,则尝试其他方法,例如 __rfloordiv__。
处理不同的数值类型
一个健壮的 __floordiv__ 实现应该处理各种数值类型,并为不支持的操作提供有意义的错误消息。
class Distance:
def __init__(self, meters):
self.meters = meters
def __floordiv__(self, other):
if isinstance(other, Distance):
return self.meters // other.meters
elif isinstance(other, (int, float)):
return Distance(self.meters // other)
else:
raise TypeError(f"Unsupported type for //: {type(other)}")
d1 = Distance(100)
d2 = Distance(30)
print(d1 // d2) # Output: 3
print(d1 // 4) # Creates new Distance(25)
这个 Distance 类处理与其他 Distance 对象(返回一个标量)和数字(返回一个新的 Distance)的地板除法。 对于不支持的类型,它会引发 TypeError。
该实现展示了如何根据右手操作数返回不同的类型,这在数值运算中是一种常见的模式。
实现 __rfloordiv__
当左操作数不支持该操作时,__rfloordiv__ 方法会处理这种情况,从而启用诸如 5 // obj 之类的操作。
class Fraction:
def __init__(self, numerator, denominator):
self.n = numerator
self.d = denominator
def __floordiv__(self, other):
if isinstance(other, Fraction):
return (self.n * other.d) // (self.d * other.n)
elif isinstance(other, (int, float)):
return (self.n // (self.d * other))
else:
return NotImplemented
def __rfloordiv__(self, other):
if isinstance(other, (int, float)):
return (other * self.d) // self.n
else:
return NotImplemented
half = Fraction(1, 2)
print(10 // half) # Output: 20 (uses __rfloordiv__)
print(half // 0.1) # Output: 5 (uses __floordiv__)
这个 Fraction 类实现了常规的和反射的地板除法。 __rfloordiv__ 方法启用了 Fraction 位于 // 运算符右侧的操作。
该示例演示了如何正确实现这两种方法,以支持具有不同操作数顺序的类交换操作。
自定义地板除法行为
__floordiv__ 可以实现特定于域的地板除法行为,该行为与标准数值除法不同。
class TimeSlot:
def __init__(self, minutes):
self.minutes = minutes
def __floordiv__(self, other):
if isinstance(other, TimeSlot):
return self.minutes // other.minutes
elif isinstance(other, (int, float)):
# Return list of equal time slots
slot_size = self.minutes // other
return [TimeSlot(slot_size) for _ in range(other)]
else:
return NotImplemented
meeting = TimeSlot(90)
print(meeting // 3) # Output: [TimeSlot(30), TimeSlot(30), TimeSlot(30)]
这个 TimeSlot 类实现了自定义地板除法行为。 当除以一个数字时,它返回一个相等时间段的列表,而不是一个单一值。
这演示了如何将 __floordiv__ 用于超出简单算术的特定于域的操作,并在适当时返回复杂的结果。
带负数的的地板除法
带负数的的地板除法具有特定的行为,在实现 __floordiv__ 时应考虑该行为。
class SignedNumber:
def __init__(self, value):
self.value = value
def __floordiv__(self, other):
if isinstance(other, SignedNumber):
return SignedNumber(self.value // other.value)
elif isinstance(other, (int, float)):
return SignedNumber(self.value // other)
else:
return NotImplemented
a = SignedNumber(-7)
b = SignedNumber(3)
print(a // b) # Output: -3 (not -2)
print(a // -3) # Output: 2 (not 3)
此示例显示了地板除法如何向负无穷大方向舍入,这与常规除法不同。 -7 // 3 等于 -3,而不是 -2。
该实现保留了 Python 的标准地板除法行为,这对于保持与内置数值类型的一致性非常重要。
最佳实践
- 处理类型检查: 验证操作数类型,并为不支持的类型返回 NotImplemented
- 实现 __rfloordiv__: 当您的类位于右侧时,支持操作
- 保持一致性: 遵循 Python 的负数地板除法规则
- 记录行为: 清楚地记录任何特殊的除法行为
- 考虑边缘情况: 适当处理除以零和其他边缘情况
资料来源
作者
列出所有 Python 教程。