Python中的运算符重载来自C++;

Python中的运算符重载来自C++;,python,function,overloading,Python,Function,Overloading,我正在尝试重载Python类中的一些运算符,该类表示一个数学分数。特别是我试图重载*操作符,这样我就可以进行分数*分数、分数*整数和整数*分数运算。我已经有了C++的一些经验,在这种情况下,我会像分数类:编写操作符重载。 friend Fraction operator*(const Fraction &f1, const Fraction &f2); friend Fraction operator*(const Fraction &f, int v); friend

我正在尝试重载Python类中的一些运算符,该类表示一个数学分数。特别是我试图重载*操作符,这样我就可以进行分数*分数、分数*整数和整数*分数运算。我已经有了C++的一些经验,在这种情况下,我会像分数类:

编写操作符重载。
friend Fraction operator*(const Fraction &f1, const Fraction &f2);
friend Fraction operator*(const Fraction &f, int v);
friend Fraction operator*(int v, const Fraction &f);
我的理解是C++知道根据你给它的参数来决定要解决的函数。然而,由于在Python中函数参数不是类型化的,我很困惑Python如何知道要解析哪个操作符重载? 例如:

def __mul__(self, other):
    return Fraction(self.numerator * other.numerator, self.denominator * other.denominator)

def __mul__(self,value):
    return Fraction(self.numerator * value,self.denominator)

第一个重载适用于两个分数,第二个重载适用于一个分数和一个整数,但是Python如何知道使用哪一个呢?我对Python完全陌生,虽然我已经使用C++了一段时间。

< P> Python根本不会用函数解析函数。您只能有一个名为
\uuuu mul\uuu
的方法作为开始;该方法没有多个具有不同签名的版本。如有必要,您必须在该方法中手动执行类型解析:

def __mul__(self, other):
    if isinstance(other, int):
        ...

请注意,尽可能多地使用duck类型是Python式的,因此您可能希望检查
hasattr(其他“分子”)
而不是严格的
isinstance
检查。

Python根本不会按类型解析函数。您只能有一个名为
\uuuu mul\uuu
的方法作为开始;该方法没有多个具有不同签名的版本。如有必要,您必须在该方法中手动执行类型解析:

def __mul__(self, other):
    if isinstance(other, int):
        ...

注意,尽可能多地使用鸭子型,所以你可能要检查<代码> HasTART(其他,‘分子’)< /C> >而不是严格的<代码> ISTebug < /Calp>检查。< /P>在C++侧进行NoTrink,我不知道为什么它如此广泛地使操作符<代码>朋友< /代码>,在几乎所有的情况下,根本不需要。你会使用一个带getter的普通函数吗?我做的是把所有的声明保存在课堂上,但我想这不是必要的。在C++方面挑剔,我不知道为什么它如此广泛地使操作符<代码>朋友<代码>,在几乎所有的情况下都不需要。我这样做是为了保留类中的所有声明,但我想这是没有必要的。