Quark's Outlines:Python 隐式类型转换规则

发布: (2026年2月21日 GMT+8 20:13)
6 分钟阅读
原文: Dev.to

I’m happy to translate the article for you, but I’ll need the full text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line and all formatting exactly as you requested.

概述

当你在 Python 中使用二元运算符如 +-* 时,解释器必须决定如何合并可能来自不同类型的两个值。Python 用来寻找共同类型或方法的过程称为 强制转换(coercion)。

Python 会检查某个对象是否知道如何处理该操作。如果它不知道,Python 会检查另一个对象。在特殊情况下,对象可以自行转换,以更好地与其他对象协作。

print(3 + 5.0)
# 8.0

这里 Python 自动将整数 3 强制转换为浮点数,以便执行加法。

当你混合使用用户自定义对象时,Python 会给你的类一个机会来控制它如何与其他对象组合。如果你的对象定义了 __add__,Python 将首先调用该方法。如果失败,Python 将尝试另一个对象的 __radd__ 方法。

在较旧的 Python 版本中,你可以定义一个名为 __coerce__ 的方法,以建议如何使两个对象兼容。该方法在 Python 3 中已被移除,但这一模式仍然说明了 Python 对混合类型的思考方式。

class MyNumber:
    def __radd__(self, other):
        return f"Called with {other}"

print(5 + MyNumber())
# Called with 5

Python 首先尝试了 5.__add__(),失败后调用了 MyNumber().__radd__(5)

Source:

历史时间线

年份里程碑
1960FORTRAN 中的类型提升允许通过将较小类型转换来混合整数和浮点数。
1972C++ 中的 运算符重载 让用户自定义类型能够控制运算符行为。
1991Python 0.9.0 引入 __coerce__,用于在运算前进行隐式转换。
2000丰富的比较和二元方法(如 __add____radd__)取代了 __coerce__
2008Python 3.0 移除 __coerce__,仅保留基于方法的强制转换和隐式数值提升。
2025自定义类型和混合运算的运算符行为通过 __op____rop__ 方法得到稳定。

正确使用 Python 强制转换规则

Python 允许你使用算术运算符和其他运算符组合不同的值。强制转换规则帮助内置类型(例如 intfloat)和用户自定义对象在不显式转换的情况下协同工作。

混合数值类型

问题: 你想在不手动转换的情况下将整数和浮点数相加。
解决方案: Python 会将较小的类型(int)提升为较大的类型(float)。

x = 7
y = 2.5
print(x + y)
# 9.5

Python 在执行加法前会内部把 7 转换为 7.0

定义右侧加法 (__radd__)

问题: 需要让一个类在 + 运算符的右侧出现时能够响应。
解决方案: 在你的类中实现 __radd__ 方法。

class Adder:
    def __radd__(self, other):
        return other + 10

a = Adder()
print(5 + a)
# 15

Python 首先尝试 5.__add__(a),如果失败,则调用 a.__radd__(5)

两个自定义类之间的协作二元操作

问题: 两个自定义对象应当能够使用 + 进行协同工作。
解决方案: Python 先在左操作数上尝试 __add__;如果失败,则回退到右操作数的 __radd__

class A:
    def __add__(self, other):
        return "A handles it"

class B:
    def __radd__(self, other):
        return "B handles it"

print(A() + B())
# A handles it

由于 A.__add__ 成功执行,B.__radd__ 并未被调用。

使用 % 进行字符串格式化

问题: 使用 % 运算符在字符串中插入值,而无需编写自定义格式化逻辑。
解决方案:% 的左操作数是字符串时,Python 会应用其内置的格式化规则。

name = "Ada"
print("Hello, %s!" % name)
# Hello, Ada!

% 运算符在格式化字符串时会绕过其他强制转换机制。

使用 * 重复序列

Problem: 在不使用显式循环的情况下,将列表或字符串重复指定次数。
Solution: Python 为 sequence * int 定义了特殊规则。

print([1, 2] * 3)
print("ha" * 2)
# [1, 2, 1, 2, 1, 2]
# haha

如果其中一个操作数是序列(listtuplestr),另一个是整数,* 将执行重复操作。

0 浏览
Back to Blog

相关文章

阅读更多 »

Python 检查数字是否为整数

python def is_intx: int | float | str | None: ''' 如果 x 表示整数值则返回 True,否则返回 False。支持:- int、float 和数值字符串,例如....'''