在 Python 面向对象编程 中,我们经常会遇到一些以双下划线开头和结尾的方法,比如 __init__、__str__ 等。这些被称为“魔术方法”(Magic Methods)或“特殊方法”(Special Methods)。今天我们要深入讲解的是 __or__ 方法 —— 它是实现 Python 位运算符重载 的关键之一。
__or__ 是 Python 中用于重载按位“或”运算符(|)的魔术方法。当你对两个对象使用 a | b 时,Python 会自动调用 a.__or__(b)。
默认情况下,自定义类的对象不支持 | 运算。但通过实现 __or__ 方法,我们可以赋予对象这种能力,从而让代码更直观、更具表达力。

在了解自定义之前,先看一个内置类型的例子:
a = 5 # 二进制: 101b = 3 # 二进制: 011result = a | b # 111 → 十进制为 7print(result) # 输出: 7这里 5 | 3 调用了 int 类型的 __or__ 方法,返回按位或的结果。
现在,我们创建一个简单的类 Permission,用来表示用户权限。每个权限是一个标志位,我们可以用 | 来组合多个权限。
class Permission: def __init__(self, name, value): self.name = name self.value = value def __or__(self, other): if isinstance(other, Permission): combined_name = f"{self.name}|{other.name}" combined_value = self.value | other.value return Permission(combined_name, combined_value) return NotImplemented def __repr__(self): return f"Permission('{self.name}', {self.value})"# 定义基本权限read = Permission("READ", 1) # 001write = Permission("WRITE", 2) # 010execute = Permission("EXECUTE", 4) # 100# 组合权限rw = read | writeprint(rw) # 输出: Permission('READ|WRITE', 3)full = rw | executeprint(full) # 输出: Permission('READ|WRITE|EXECUTE', 7)在这个例子中,我们通过重载 __or__ 方法,使得权限对象可以像位掩码一样进行组合。这正是 Python 魔术方法 强大之处:让自定义对象行为更自然。
NotImplemented:如果传入的参数类型不支持,应返回 NotImplemented(不是字符串!),这样 Python 会尝试调用对方的 __ror__ 方法。__or__ 应返回一个新对象,而不是修改 self。a | b 和 b | a 行为一致,可能还需要实现 __ror__(右操作版本)。有趣的是,Python 的 set 类型也重载了 | 运算符,用于求并集:
set1 = {1, 2, 3}set2 = {3, 4, 5}union_set = set1 | set2print(union_set) # 输出: {1, 2, 3, 4, 5}这说明 __or__ 不仅限于位运算,在语义上也可以表示“合并”或“联合”,只要符合逻辑即可。
通过本教程,你已经掌握了 Python __or__方法 的核心用法。它不仅用于底层的位运算,还能在高级抽象中提升代码可读性。无论你是初学者还是进阶开发者,理解这类 Python魔术方法 都能让你写出更优雅、更 Pythonic 的代码。
记住:合理使用运算符重载,能让对象之间的交互更自然;但过度使用可能导致代码难以理解。保持简洁与清晰,才是 Python 哲学的精髓。
现在,试着为你自己的类添加 __or__ 方法吧!
本文由主机测评网于2025-12-22发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251211264.html