python:类重写“is”行为

python:类重写“is”行为,python,Python,我正在编写一个类来封装任意对象,包括简单类型。我希望is关键字对封装的值进行操作,例如以下行为: Wrapper(True) is True -> True Wrapper(False) is True -> False Wrapper(None) is None -> True Wrapper(1) is 1 -> True 是否有任何对象方法可以重写以获得此行为?否。是、和、和或不能重载。通常,如果要测试x为1、True或None时的值是否相等,则无论如何都要使用=

我正在编写一个类来封装任意对象,包括简单类型。我希望is关键字对封装的值进行操作,例如以下行为:

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

是否有任何对象方法可以重写以获得此行为?

否。是、和、和或不能重载。

通常,如果要测试x为1、True或None时的值是否相等,则无论如何都要使用==运算符。如果要使用is运算符,通常需要测试某个对象是否引用了其他对象,如list1是list2

如果要为==定义特殊行为,可以在类定义中定义uu eq

否。是、和、和或不能重载

的确如此。我相信关键字是保留的,不能重载或更改

见:

以下标识符用作语言的保留字或关键字,不能用作普通标识符

名单如下: ['and','as','assert','break','class','continue','def','del','elif','else','exec','FINAL','for','from','global','if','import','in','is','lambda','not','or','pass','print raise','return','try','while','

可以通过命令查看此列表

关键字.kwlist

别忘了先导入关键字

此外:

关键字。iskeyword'is'

返回True

更新:

我的回答不好,我应该感到不好

我自己也和德尔搞砸了。我不知道为什么我没有注意到

第二次尝试:

以下文档提供了类上可自定义行为的完整列表。这包括重写和重载运算符的所有方法。”不包括“是”

我所能做的就是。

本身不能过载,但您可能会对其他适合您的用例的线程感兴趣,因为您正在查看以下线程:

__实例检查自身,实例 检查实例是否为您定义的类的实例,例如isinstanceinstance、class

__子类检查自身,子类 检查类是否为您定义的类的子类,例如issubclasssubclass、class


Python文档中有这样的内容吗?找不到任何东西来验证这一点。唯一的参考是langref§3.4中没有它们。这个答案很古老。对于最新的Python版本来说仍然是这样吗?@Fran:是的。关于这些操作符的行为没有改变。我想我知道为什么不能重写。字典查找和设置查找用于快速相等性检查,因为_ueq_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果is行为是可重写的,则无法保证快速字典查找,这将对python的性能造成不利影响。但是,可以重载del,例如,可以重载del x[i]或del x.attr。问题在于语义是否可以改变,而不是语法。in是否可以直接重载。可以在上下文管理器中部分重载。导入和for可以间接重载。x为1是危险的,但x为None是完全正确的。True、False和None都是,我认为整数-5到257在CPython中也是静态分配的,但是您可以创建一个不相同的整数。