Я реализую простой класс для представляют собой 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 __ ()
, которое я не понимаю?