当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python __rmul__用法及代码示例


对于每个操作员标志,都有一个潜在的机制。这种基础机制是一种特殊的方法,将在操作员操作期间调用。这种特殊的方法称为魔术方法。对于+,-,*,/等每个算术运算,我们需要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]

相关用法


注:本文由纯净天空筛选整理自krishna krish大神的英文原创作品 __rmul__ in Python。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。