python 在什麼情況下 rmul

2022-07-23 19:45:13 字數 1152 閱讀 1238

在自定義列表mylist之後 ,3 * mylist 報錯,mylist已經過載了 * ,但是3沒有,這時同學告訴我可用 __ rmul __

說我有乙個列表l。在什麼情況下l .__ rmul __(自我,其他)叫?

我基本上理解了文件,但我也想看到乙個例子,澄清它的用法,毫無疑問。

當python試圖乘以兩個物件時,它首先嘗試呼叫左物件的__mul __()方法。如果左物件沒有__mul __()方法(或者方法返回notimpemented,表示它不適用於正確的運算元),python想知道正確的物件是否可以進行乘法。如果右運算元與左邊的型別相同,python知道它不能,因為如果左物件不能做到,同一型別的另乙個物件肯定不能。

如果兩個物件是不同的型別,python,這是值得一試。然而,它需要一些方法來告訴正確的物件它是操作中的正確的物件,如果操作不是可交換的。 (乘法當然是,但不是所有的運算子都是,在任何情況下*不總是用於乘法!)所以它呼叫__rmul __()而不是__mul __()。

例如,考慮以下兩個語句:

print "nom" * 3

print 3 * "nom"

在第一種情況下,python呼叫字串的__mul __()方法。字串知道如何將它自身乘以乙個整數,所以一切都很好。在第二種情況下,整數不知道如何用乙個字串乘以自身,所以它的__mul()__返回notimplemented,而字串的__rmul()__被呼叫。它知道做什麼,你得到與第一種情況相同的結果。

現在我們可以看到,__rmul()__允許所有的字串的特殊乘法行為包含在str類中,這樣其他型別(如整數)不需要知道任何關於字串的資料,以便能夠乘以它們。一百年後(假設python仍在使用),你將能夠定義乙個新的型別,可以乘任何乙個整數的順序,即使int類已經知道了乙個多世紀。

順便說一句,字串類的__mul __()在一些python版本中有乙個錯誤。如果它不知道如何乘以乙個物件本身,它引發乙個typeerror,而不是返回notimplemented。這意味著即使使用者定義的型別具有__rmul __()方法,也不能將字串乘以使用者定義的型別,因為字串從不允許它有機會。使用者定義的型別必須先行(例如foo()*』bar』而不是』bar』* foo()),所以它的__mul __()被呼叫。他們似乎已經固定在python 2.7(我測試了它在python 3.2也),但python 2.6.6有錯誤。

layoutSubviews在什麼情況下呼叫

1.在以下情況都會呼叫 注意 當view的size的值為0的時候,addsubview也不會呼叫layoutsubviews。當要給這個view新增子控制項的時候不管他的size有沒有值都會呼叫 2.先來看一下uiview的layoutsubviews在什麼情況下會呼叫 subview view s...

復合索引在什麼情況下使用

1 復合索引使用的目的是什麼?能形成索引覆蓋,提高where語句的查詢效率 2 乙個復合索引是否可以代替多個單一索引?復合索引的使用原則是第乙個條件應該是復合索引的第一列,依次類推,否則復合索引不會被使用 所以,正常情況下復合索引不能替代多個單一索引 3 在進行哪些型別的查詢時,使用復合索引會比較有...

socket在什麼情況下可讀可寫

一 下列四個條件中的任何乙個滿足時,socket準備好讀 1.socket接收緩衝區中已經接收的資料的位元組數大於等於socket接收緩衝區低潮限度的當前值 對這樣的socket的讀操作不會阻塞,並返回乙個大於0的值 即 準備好讀入的資料的位元組數 我們可以用socket選項so rcvlowat來...