为什么这段代码运行结果是这样的? 坑爹啊,为什么没有缩进…… 对于基础类型或者未定义__eq__方法的对象为什么可以直接调用右值的方法……

2014-05-28 14:55:32 +08:00
 xieys
class A(object):
def __eq__(self,other):
print 'A'

class B(object):
def __eq__(self, other):
print 'B'

class C(object):
pass

a=A()
b=B()
c=C()

a==b
b==a
c==a
a==c
a=='123'
'123'==a
print '123'==c
print c=='123'


---------------------------------------------
A
B
A
A
A
A
False
False
2506 次点击
所在节点    Python
3 条回复
mengzhuo
2014-05-28 15:08:13 +08:00
请用gist
python 的 eq实现,当左对象没有__eq__时,调用另一个的__eq__
hahastudio
2014-05-28 15:10:36 +08:00
可以看这里 http://eev.ee/blog/2012/03/24/python-faq-equality/

就你结果来看,对于新类,== 是这么判断的
1. 左侧的类有没有自定义实现 __eq__?如果有,就调用left.__eq__(right)
2. 右侧的类有没有自定义实现 __eq__?如果有,就调用right.__eq__(left)

其实你可以试试C继承A,重写__eq__,a==c会print 'C',根据blog,可以追加:
0. 右侧的类是左侧的类的子类,并且重写了__eq__,调用right.__eq__(left)
3. 都没有?尝试使用__cmp__重复上述过程
4. 尝试调用object.__eq__(a, b)
konakona
2014-05-31 18:04:13 +08:00
用IDE格式化一下...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/114714

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX