1. Python / Говнокод #12055

    −103

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    class GovnoClass(object):
        def __init__(self, khooj, pizda, djigurda):
            self.khooj = khooj
            self.pizda = pizda
            self.djigurda = djigurda
    
        def __eq__(self, right):
            return (self.khooj , self.pizda, self.djigurda ) == right
    
    
    a = GovnoClass(1,4,88)
    b = GovnoClass(1,4,88)
    
    print a==b

    Выводит True. Почему?

    Запостил: serpinski, 04 Ноября 2012

    Комментарии (8) RSS

    • >GovnoClass, khooj, pizda, djigurda
      Ответить
    • http://ideone.com/Eiz9Aj
      Ответить
    • > Почему?
      По кочану: http://ideone.com/XTFmRZ
      Ответить
      • Поясните мысль.
        Ответить
        • Если внимательно посмотреть на выхлоп программы, то увидим, что __eq__ вызывается дважды - первый раз ей приходит 2 объекта (вызов из строки 14), а второй раз объект и тупл (вызов из строки 8).

          В доке по питону насчет этого есть вот такая мутная фраза: There are no swapped-argument versions of these methods (to be used when the left argument does not support the operation but the right argument does); rather, __lt__() and __gt__() are each other’s reflection, __le__() and __ge__() are each other’s reflection, and __eq__() and __ne__() are their own reflection.
          Ответить
    • > Почему?

      Сначала вызвается __eq__ первого объекта ( a, b ), 
      .   который вызывает __eq__ второго объекта ( b, (..a's fileds..) ), 
      .       который возвращает результат 
      .           сравнения туплов (..a's fileds..) и (..b's fileds..).
      Ответить
    • Автор, ты чего хочешь? Сравнить два объекта и узнать, не один ли и тот же это объект что ли?

      дык, проверяй через is тогда.
      http://ideone.com/6B6ANN
      Ответить

    Добавить комментарий