对于每个操作员标志,都有一个潜在的机制。这种基础机制是一种特殊的方法,将在操作员操作期间调用。这种特殊的方法称为魔术方法。对于+,-,*,/等每个算术运算,我们需要2个操作数来执行运算符函数。
例子:
‘+’ ? ‘__add__’ method ‘_’ ? ‘__sub__’ method ‘*’ ? ‘__mul__’ method
由于本文仅限于乘法函数,因此我们将在此处了解乘法过程。要执行乘法函数,我们必须将运算符与左/右操作数绑定在一起。之前,去__rmul__
方法,我们将看到__mul__
方法,可帮助我们生动地理解乘法函数。
__mul__()
让我们表达一下x*y
其中x是A类的实例。__mul__
方法,运算符会检查__mul__的存在形式的左操作数(x),即,运算符(*)将检查A类是否存在“__mul__
’的方法。如果有__mul__
方法,它调用x.__mul__(y)
。否则,它会引发“ TypeError:unsupported操作数”错误消息。
范例1:
class Foo(object):
def __init__(self, val):
self.val = val
def __str__(self):
return "Foo [% s]" % self.val
class Bar(object):
def __init__(self, val):
self.val = val
def __str__(self):
return "Bar [% s]" % self.val
# Driver Code
f = Foo(5)
b = Bar(6)
print(f * b)
输出:
TypeError, unsupported operand type(s) for *:'Foo' and 'Bar'
在上面的示例中,第一个操作数是f及其类Foo()。由于Foo()没有__mul__
方法,它不知道如何相乘。因此,它将显示TypeError消息。如果我们检查其他类别Bar(),即使它没有__mul__
方法。因此,即使我们将乘法取反为(b * f),也会抛出相同的错误
范例2:让我们在Foo类中添加__mul__方法。
class Foo(object):
def __init__(self, val):
self.val = val
def __mul__(self, other):
return Foo(self.val * other.val)
def __str__(self):
return "Foo [% s]" % self.val
class Bar(object):
def __init__(self, val):
self.val = val
def __str__(self):
return "Bar [% s]" % self.val
# Driver Code
f = Foo(5)
b = Bar(6)
print(f * b)
输出:
Foo 30
如前所述,默认情况下,运算符会查询左操作数的类,并在其中找到__mul__方法。现在它知道该怎么办了,结果是30f.__mul__(b) = 5.__mul__(6)
。如果我们将乘法取反为(b * f),它将再次引发问题,因为它查找的左操作数的类别(Bar())没有任何内容__mul__
方法。b.__mul__(f)
将抛出该问题,因为b的Bar()类没有__mul__
方法。
__rmul__
两者之间略有差异__mul__
和__rmul__
是,操作员寻找__mul__
在左操作数中并寻找__rmul__
在正确的操作数中。例如,x * y。操作员寻找__rmul__
y的类别定义中的方法。如果找到__rmul__
方法,它将显示结果,否则抛出TypeError错误消息
范例1:让我们以上面的示例进行一些小的修改。
class Foo(object):
def __init__(self, val):
self.val = val
def __str__(self):
return "Foo [% s]" % self.val
class Bar(object):
def __init__(self, val):
self.val = val
def __rmul__(self, other):
return Bar(self.val * other.val)
def __str__(self):
return "Bar [% s]" % self.val
# Driver code
f = Foo(5)
b = Bar(6)
print(f * b)
输出:
Bar 30
在上面的示例中,假设f * b为b.__rmul__(f)
如__rmul__
方法存在于实例b的Bar()类中。如果我们将乘法反转为(b * f)。该符号将是f.__rmul__(b)
。如果没有__rmul__
方法,它无法理解要注释的内容并抛出TypeError消息。’
这些类型的运算符需要2个操作数,默认情况下会同时携带两个__mul__
和__rmul__
方法。要同时执行正向和反向乘法,请参见以下示例。
范例2:
class Foo(object):
def __init__(self, val):
self.val = val
def __str__(self):
return "Foo [% s]" % self.val
class Bar(object):
def __init__(self, val):
self.val = val
def __rmul__(self, other):
return Bar(self.val * other.val)
def __mul__(self, other):
return self.__rmul__(other)
def __str__(self):
return "Bar [% s]" % self.val
# Driver Code
f = Foo(5)
b = Bar(6)
print(b * f)
print(f * b)
输出:
Bar [30] Bar [30]
相关用法
- Python Pandas dataframe.rmul()用法及代码示例
- Python Pandas Panel.rmul()用法及代码示例
- Python Pandas Series.rmul()用法及代码示例
- Python Sympy Permutation.rmul()用法及代码示例
注:本文由纯净天空筛选整理自krishna krish大神的英文原创作品 __rmul__ in Python。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。