ZetCode

Python __int__ 方法

最后修改于 2025 年 4 月 8 日

本综合指南将探讨 Python 的 __int__ 方法,这是负责整数转换的特殊方法。我们将涵盖基本用法、自定义实现、数字运算和实际示例。

基本定义

__int__ 方法是一个特殊方法,它定义了对象应如何转换为整数。当将对象转换为整数时,内置的 int() 函数会调用它。

关键特征:它不接受任何参数(self 除外),必须返回一个整数,并使对象能够参与整数上下文。它是 Python 数字协议的一部分,与 __float____index__ 并列。

基本 __int__ 实现

这是一个实现 __int__ 的简单类,用以演示对象如何定义自己的整数转换行为。

basic_int.py
class Distance:
    def __init__(self, meters):
        self.meters = meters
    
    def __int__(self):
        return int(self.meters)

d = Distance(3.7)
print(int(d))  # Output: 3

此示例展示了一个 Distance 类,该类通过截断其米值来转换为整数。当应用于 Distance 实例时,int() 函数会调用 __int__

该实现仅将调用委托给 Python 内置的 int() 对 meters 属性的转换。对于包装器类来说,这是一种常见模式。

自定义数字转换

当简单的属性转换不足时,__int__ 可以实现自定义转换逻辑。在这里,我们将一个温度对象转换为整数。

temperature.py
class Celsius:
    def __init__(self, temperature):
        self.temperature = temperature
    
    def __int__(self):
        return round(self.temperature)

temp = Celsius(36.6)
print(int(temp))  # Output: 37

这个 Celsius 类在转换为整数时会对温度进行四舍五入。__int__ 方法提供了对转换过程的控制。

对于测量精度很重要的测量值,四舍五入通常比截断更合适。该方法可以实现所需的任何转换逻辑。

货币转换示例

对于金融应用程序,__int__ 可以将货币对象转换为其最小单位(例如美分)的整数值。

currency.py
class Dollar:
    def __init__(self, amount):
        self.amount = amount
    
    def __int__(self):
        return int(self.amount * 100)

price = Dollar(4.99)
cents = int(price)
print(cents)  # Output: 499

这个 Dollar 类在转换为整数时会将美元金额转换为美分。__int__ 方法在转换前乘以 100。

金融应用程序通常需要这种类型的转换来进行精确的算术运算,以避免浮点舍入错误。

分数到整数转换

__int__ 方法可以在转换过程中实现数学运算,例如将分数转换为整数。

fraction.py
class Fraction:
    def __init__(self, numerator, denominator):
        self.numerator = numerator
        self.denominator = denominator
    
    def __int__(self):
        return self.numerator // self.denominator

half = Fraction(1, 2)
print(int(half))  # Output: 0
three_halves = Fraction(3, 2)
print(int(three_halves))  # Output: 1

这个 Fraction 类在转换为整数时实现整数除法。// 运算符执行地板除法以获得整数部分。

这与 Python 内置数字类型的行为相符,在这些类型中,int() 会向零截断。如果需要,该方法也可以实现其他舍入。

具有多个属性的自定义对象

对于复杂对象,__int__ 可以根据特定于域的逻辑将多个属性组合成一个整数值。

complex_object.py
class RGBColor:
    def __init__(self, red, green, blue):
        self.red = red
        self.green = green
        self.blue = blue
    
    def __int__(self):
        return (self.red << 16) | (self.green << 8) | self.blue

color = RGBColor(255, 128, 0)
print(int(color))  # Output: 16744448 (0xFF8000)

这个 RGBColor 类将三个 8 位颜色通道组合成一个 24 位整数值。位移将组件组合成标准的 RGB 格式。

__int__ 方法使得颜色能够在需要数值颜色值的上下文中被使用,例如某些图形库或数据库。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 Python 教程