Python 方法运算符重载

Python 方法运算符重载,python,overloading,operator-keyword,Python,Overloading,Operator Keyword,Python如何选择使用方法重载的对象 例如: class a: def __init__(self, other): self.data = other def __add__(self, other): return self.data + other def __radd__(self,other): return self.data + other X = a(1) X+1 1+X 为什么在X+1表达式中,在左侧

Python如何选择使用方法重载的对象

例如:

class a:
    def __init__(self, other):
        self.data = other
    def __add__(self, other):
        return self.data + other
    def __radd__(self,other):
        return self.data + other
X = a(1) 
X+1
1+X
为什么在
X+1
表达式中,在左侧的对象中调用一个方法
\uuuuuuuuuuuuuuuu
,在右侧的对象中调用表达式
1+X
方法
\uuuuuuuuuuuu

X+1
第一,呼吁:

X.__add__(1)
这是成功的,因此不需要进一步的工作


另一方面,这:

1+X
召唤

这会失败,因为
int
不知道如何与类
a
接口。“作为最后的手段”,这是尝试:

X.__radd__(1)
从:

仅当左操作数不支持相应的操作且操作数类型不同时,才会调用这些函数

第一,呼吁:

X.__add__(1)
这是成功的,因此不需要进一步的工作


另一方面,这:

1+X
召唤

这会失败,因为
int
不知道如何与类
a
接口。“作为最后的手段”,这是尝试:

X.__radd__(1)
从:

仅当左操作数不支持相应的操作且操作数类型不同时,才会调用这些函数

第一,呼吁:

X.__add__(1)
这是成功的,因此不需要进一步的工作


另一方面,这:

1+X
召唤

这会失败,因为
int
不知道如何与类
a
接口。“作为最后的手段”,这是尝试:

X.__radd__(1)
从:

仅当左操作数不支持相应的操作且操作数类型不同时,才会调用这些函数

第一,呼吁:

X.__add__(1)
这是成功的,因此不需要进一步的工作


另一方面,这:

1+X
召唤

这会失败,因为
int
不知道如何与类
a
接口。“作为最后的手段”,这是尝试:

X.__radd__(1)
从:

仅当左操作数不支持相应的操作且操作数类型不同时,才会调用这些函数



1+X
的情况下,您是指
\uuuuu radd\uuuu
?因为你写了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。你读了吗?user2494676先生,请检查你的问题,我们相信你读错了@SethMMorton的评论。你是说
1+X
案例中的
\uuuuuuuuuuuuuu?因为你写了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。你读了吗?user2494676先生,请检查你的问题,我们相信你读错了@SethMMorton的评论。你是说
1+X
案例中的
\uuuuuuuuuuuuuu?因为你写了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。你读了吗?user2494676先生,请检查你的问题,我们相信你读错了@SethMMorton的评论。你是说
1+X
案例中的
\uuuuuuuuuuuuuu?因为你写了
。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!这有助于避免违背我的意愿tangent@thefourtheye请问为什么一定要有
()
?为什么它不像
“”。join(['a',b'])
?@zhangxaochen否则解析器认为
1.
是浮点数的开头,但
\uu
在浮点数中无效。这就是为什么我们必须显式地让Python分别计算
1
。@thefourtheye哦,我没有注意到这一点。但是既然数字不能作为方法名的开头,为什么解析器不能区分浮点数和方法调用呢?仅供参考,
print(1)。\uuu add\uuu(10)
将打印
11
。啊,是的,括号!这有助于避免违背我的意愿tangent@thefourtheye请问为什么一定要有
()
?为什么它不像
“”。join(['a',b'])
?@zhangxaochen否则解析器认为
1.
是浮点数的开头,但
\uu
在浮点数中无效。这就是为什么我们必须显式地让Python分别计算
1
。@thefourtheye哦,我没有注意到这一点。但是既然数字不能作为方法名的开头,为什么解析器不能区分浮点数和方法调用呢?仅供参考,
print(1)。\uuu add\uuu(10)
将打印
11
。啊,是的,括号!这有助于避免违背我的意愿tangent@thefourtheye请问为什么一定要有
()
?为什么它不像
“”。join(['a',b'])
?@zhangxaochen否则解析器认为
1.
是浮点数的开头,但
\uu
在浮点数中无效。这就是为什么我们必须显式地让Python分别计算
1
。@thefourtheye哦,我没有注意到这一点。但是既然数字不能作为方法名的开头,为什么解析器不能区分浮点数和方法调用呢?仅供参考,
print(1)。\uuu add\uuu(10)
将打印
11
。啊,是的,括号!这有助于避免违背我的意愿tangent@thefourtheye请问为什么一定要有
()
?为什么它不像
“”。join(['a',b'])
?@zhangxaochen否则解析器认为
1.
是浮点数的开头,但
\uu
在浮点数中无效。这就是为什么我们必须显式地让Python分别计算
1
。@thefourtheye哦,我没有注意到这一点。但是既然数字不能作为方法名的开头,为什么解析器不能区分浮点和方法调用呢?