我正在编写一个封装任意对象的类,包括简单类型。我希望“is”关键字对封装值进行操作,例如此行为:
Wrapper(True) is True -> True
Wrapper(False) is True -> False
Wrapper(None) is None -> True
Wrapper(1) is 1 -> True
我是否可以覆盖任何对象方法来获取此行为?
答案 0 :(得分:28)
没有。 <{1}},is
和and
无法重载。
答案 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}},
is
和and
无法重载。
事实上。我相信关键字是保留的,不能重载或更改。
请参阅: 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
我能做的最好。