對於每個操作員標誌,都有一個潛在的機製。這種基礎機製是一種特殊的方法,將在操作員操作期間調用。這種特殊的方法稱為魔術方法。對於+,-,*,/等每個算術運算,我們需要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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。