python: 类重载 "is" 行为

32 投票
5 回答
13784 浏览
提问于 2025-04-16 05:53

我正在写一个类,这个类可以包装任何对象,包括一些简单的数据类型。我希望“is”这个关键字能够作用于被包装的值,比如说我想要这样的效果:

Wrapper(True) is True -> True
Wrapper(False) is True -> False
Wrapper(None) is None -> True
Wrapper(1) is 1 -> True

请问有没有什么对象的方法可以重写,以实现这种效果呢?

5 个回答

4

一般来说,如果你想测试两个值是否相等(比如 x 是 1、True 或者 None),你可以使用 == 这个运算符。如果你想用 is 运算符,通常是在检查某个东西是否指向另一个东西,比如 list1 is list2

如果你想为 == 定义一些特殊的行为,可以在你的类定义中添加 __eq__

7

is 本身是不能被重载的,但你可能会对其他一些“反射”魔法方法感兴趣,这些方法可能适合你的使用场景(因为你在看这个讨论):

__instancecheck__(self, instance) 这个方法用来检查一个实例是否是你定义的类的实例(比如说用 isinstance(instance, class) 来判断)。

__subclasscheck__(self, subclass) 这个方法用来检查一个类是否是你定义的类的子类(比如说用 issubclass(subclass, class) 来判断)。

47

不可以。isandor这几个东西是不能被重载的。

撰写回答