V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xieys
V2EX  ›  Python

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

  •  
  •   xieys · 2014-05-28 14:55:32 +08:00 · 2479 次点击
    这是一个创建于 3823 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    3 条回复    2014-05-31 18:04:13 +08:00
    mengzhuo
        1
    mengzhuo  
       2014-05-28 15:08:13 +08:00
    请用gist
    python 的 eq实现,当左对象没有__eq__时,调用另一个的__eq__
    hahastudio
        2
    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
        3
    konakona  
       2014-05-31 18:04:13 +08:00
    用IDE格式化一下...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1236 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:15 · PVG 07:15 · LAX 15:15 · JFK 18:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.