Python奇怪的错误:“引用;类型错误:';非类型';对象不可调用";

Python奇怪的错误:“引用;类型错误:';非类型';对象不可调用";,python,Python,我正在实现一个简单的类来表示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

我正在实现一个简单的类来表示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 )
错误消失了

我发现有很多关于类似的错误的问题——似乎都涉及到某个函数名被某个变量覆盖,但我看不出这是在哪里发生的

另一个线索是,当我将默认返回类型
\uuu getattr\uuu()
更改为其他类型(例如str)时,错误会变形为
TypeError:“str”对象不可调用


你知道发生了什么事吗?
\uuu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,当查找
\uuuu add\uuuu
方法时,
\uuuu getattr\uuuuu
返回
,从而返回错误

您可以通过使
\uuuu getattr\uuuu
为其他属性返回值来修复此问题。事实上,您必须确保
\uuu getattr\uu
从其超类为所有未处理的属性调用该方法。但实际上,这里使用的
\uu getattr\uuu
是错误的。它应该节约使用,当没有更明显、更高级别的解决方案可用时。例如,
\uuuu getattr\uuuu
对于动态调度至关重要。但是在您的例子中,
x
y
值在代码运行之前是众所周知的,并且定义得很好

正确的解决方案是创建
x
y
属性,而根本不实现
\uuuu getattr\uuuu

@property
def x(self):
    return self.vec_repr[0]

@property
def y(self):
    return self.vec_repr[1]

就为了完整的画面,它试图调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!哦。哇,谢谢。我认为当它在其他地方找不到属性时,它会依赖于_getattr__;()。嗯,这是非常令人尴尬的。即使是一个简单的
a
也会失败,因为没有
\uuuu repr\uuu
。我只是说,不仅
a+b
会失败,而且
a
以及默认的
\uuuu repr\uuu
会被
\uu getattr\uu
错误所掩盖。