python:类覆盖“是”行为

时间:2010-10-22 01:22:35

标签: python

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

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

我是否可以覆盖任何对象方法来获取此行为?

4 个答案:

答案 0 :(得分:28)

没有。 <{1}},isand无法重载。

答案 1 :(得分:4)

通常,如果要根据值测试相等性(如果x为1,或者为True或无),则无论如何都要使用==运算符。如果您想使用is运算符,您通常会测试某些内容是否指的是其他内容,例如list1 is list2

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

答案 2 :(得分:0)

is本身不能重载,但是您可能会对其他"Reflection" magic methods感兴趣,它们可能适合您的用例(因为您正在查看此线程):

  

__instancecheck__(self, instance)   检查实例是否是您定义的类的实例(例如isinstance(instance, class)

     

__subclasscheck__(self, subclass)   检查一个类是否是您定义的类的子类(例如issubclass(subclass, class))。

答案 3 :(得分:-3)

  

没有。 <{1}},isand无法重载。

事实上。我相信关键字是保留的,不能重载或更改。

请参阅: http://docs.python.org/2/reference/lexical_analysis.html#keywords

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

列表是: ['和','作为','断言','打破','阶级','继续','def','del','elif','else','除','exec','最后','代表','来自','全球','if','import','in','is','lambda','not','或','pass','print' ,'加','回','尝试','同时','带','收益']

可以通过命令

查看此列表

keyword.kwlist

(不要忘记先输入关键字)

此外:

keyword.iskeyword( '是')

返回True


更新

我的回答很糟糕,我应该心疼。

我和德尔一起搞砸了。我不知道为什么我没注意到......

第二次尝试:

以下文档提供了类的可自定义行为的完整列表。这包括覆盖和重载运算符的所有方法。 'is'不包括在内。

http://docs.python.org/2/reference/datamodel.html#special-method-names

我能做的最好。