Странная ошибка Python: «TypeError: объект« NoneType »не вызывается»

Я реализую простой класс для представляют собой 2D-вектор. Вот соответствующие биты:

class Vector:
  def __init__( self, x, y ):
    self.vec_repr = x, y

  def __add__( self, other ):
    new_x = self.x + other.x
    new_y = self.y + other.y
    return Vector( new_x, new_y )

  def __getattr__( self, name ):
    if name == "x":
      return self.vec_repr[0]
    elif name == "y":
      return self.vec_repr[1]

Позже у меня есть что-то вроде:

a = Vector( 1, 1 )
b = Vector( 2, 2 )
a + b

Я получаю TypeError: объект 'NoneType' не вызывается . Это особенно странно, потому что ошибка не помечена как относящаяся к какой-либо конкретной строке, поэтому я не знаю, где искать!

Очень странно, поэтому я провел несколько экспериментов и обнаружил, что это происходит на линии a + b . Кроме того, когда я переделываю класс, чтобы он выглядел следующим образом:

class Vector:
  def __init__( self, x, y ):
    self.x, self.y = x, y

  def __add__( self, other ):
    new_x = self.x + other.x
    new_y = self.y + other.y
    return Vector( new_x, new_y )

Ошибка исчезает!

Я вижу, что есть много вопросов об ошибке, похожей на эту - все, похоже, связаны с тем, что какое-то имя функции где-то перезаписывается переменная, но я не вижу, где это происходит!

Еще одна подсказка: когда я меняю тип возвращаемого значения по умолчанию __ getattr __ () на что-то еще - например, str - ошибка трансформируется в TypeError: объект 'str' не вызывается

Есть идеи относительно того, что происходит? Есть ли какое-то поведение __ getattr __ () , которое я не понимаю?

8
задан Slubb 31 July 2011 в 18:34
поделиться