當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。