运算符表达式与直接调用新型python类中的内置方法

运算符表达式与直接调用新型python类中的内置方法,python,python-3.x,Python,Python 3.x,我有一个类试图对其对象调用add函数。 考虑下面的代码: class Test(object): data = "hello" def __getattr__(self, name): print('getattr: ' + name) return getattr(self.data, name) >>> obj = Test() >>> obj + 'world' TypeError: unsupporte

我有一个类试图对其对象调用add函数。 考虑下面的代码:

class Test(object):
    data = "hello"
    def __getattr__(self, name):
        print('getattr: ' + name)
        return getattr(self.data, name)

>>> obj = Test()
>>> obj + 'world'
TypeError: unsupported operand type(s) for +: 'Test' and 'str'
>>> type(obj).__add__(obj, 'world')
AttributeError: type object 'Test' has no attribute '__add__'
在新式课堂上

(obj + "world")
相当于

type(obj).__add__(obj,"world")    
那么,为什么在这两种情况下我会得到不同的错误呢?
我期待着同样的错误,因为这两个语句对我来说都是一样的。我几周前开始使用python。因此,我无法找到我在这里缺少的概念。

运算符
+
类型(obj)不完全等效。\uuuuuuu add\uuu
<代码>+还调用
类型(其他)。\uuuu radd\uuuu
如果未定义其他方法,并且在两个方法都不存在时抛出更多描述性错误。如果要将
+
作为一个函数进行精确模拟,请使用
操作符。添加

+
操作符并不完全等同于
类型(obj)。\uuuuuuuuuuuuu添加
<代码>+
还调用
类型(其他)。\uuuu radd\uuuu
如果未定义其他方法,并且在两个方法都不存在时抛出更多描述性错误。如果要将
+
作为函数进行精确模拟,请使用
运算符。add

第一个错误来自操作数
+
,第二个错误来自对象
测试
是的,第一个错误来自“+”,但该“+”在内部调用add方法,如:type(obj)。\uu add_j(obj,“world”)。那么这两者有什么不同呢?顺便说一句,感谢您的响应:)第一个错误来自操作数
+
,第二个错误来自对象
测试
是的,第一个错误来自“+”,但这个“+”在内部调用add方法,如下所示:type(obj)。\uuuuuuuuadd(obj,“world”)。那么这两者有什么不同呢?顺便说一句,感谢您的回复:)谢谢,但我正在寻找这两种方法之间的确切区别。如果它是索引操作而不是添加,那么obj[index]与type(obj)会有多大的不同。\uuu getitem\uuu(obj,index)?@geek在索引的情况下,唯一的区别是额外的错误消息。对于
+
,我相信这是唯一的区别。谢谢,但我正在寻找这两种方法之间的确切区别。如果它是索引操作而不是添加,那么obj[index]与type(obj)会有多大的不同。\uuu getitem\uuu(obj,index)?@geek在索引的情况下,唯一的区别是额外的错误消息。对于
+
,我认为这是唯一的区别。