是否可以在Python中覆蓋+ =?在Python中重寫「+ =」? (__iadd __()方法)
回答
是的,覆蓋__iadd__
方法。例如:
def __iadd__(self, other):
self.number += other.number
return self
如果您的類表示不可變對象,則不應該實現`__iadd__`。在這種情況下,只需實現`__add__`來代替`+ =`。例如,你可以在不可變的類型(如字符串和整數)上使用`+ =`,這是無法用`__iadd__`完成的。 – 2010-01-04 23:26:57
http://docs.python.org/reference/datamodel.html#emulating-numeric-types
例如,執行語句 X + = y,其中x是具有__iadd __()方法, X .__ iadd__一個 類的實例(y)被調用。
除了超載__iadd__
(記得要回自己!),你也可以回退到上__add__
,爲x + = Y會像X = X + Y。 (這是+ =運營商的陷阱之一。)
>>> class A(object):
... def __init__(self, x):
... self.x = x
... def __add__(self, other):
... return A(self.x + other.x)
>>> a = A(42)
>>> b = A(3)
>>> print a.x, b.x
42 3
>>> old_id = id(a)
>>> a += b
>>> print a.x
45
>>> print old_id == id(a)
False
它甚至trips up experts:
class Resource(object):
class_counter = 0
def __init__(self):
self.id = self.class_counter
self.class_counter += 1
x = Resource()
y = Resource()
你期望x.id
,y.id
和Resource.class_counter
有什麼樣的價值觀?
除了什麼是正確答案上面給出的,這是值得澄清明確的是,當__iadd__
被覆蓋,則x += y
操作不__iadd__
方法的結束而終止。
取而代之的是以x = x.__iadd__(y)
結尾。換句話說,在實現完成後,Python會將您實現的實現的返回值分配給您要「添加到」的對象。
這意味着可以對x += y
操作的左側進行變異,以便最終的隱式步驟失敗。考慮當你添加的東西的清單中這會發生什麼:現在
>>> x[1] += y # x has two items
,如果你的__iadd__
實現(在x[1]
對象的方法)錯誤地或故意刪除的第一項(x[0]
)從列表開始,Python將運行您的__iadd__
方法)&嘗試將其返回值分配給x[1]
。這將不再存在(將在x[0]
),導致ÌndexError
。
或者,如果您__iadd__
插入東西的上面的例子中x
開始,你的目標將是在x[2]
,不x[1]
,不管是早些時候在x[0]
現在將在x[1]
和被分配__iadd__
的返回值調用。
除非人們明白髮生了什麼,否則導致的錯誤可能是修復的噩夢。
- 1. python int沒有__iadd __()方法?
- 2. 在Python中重寫set方法
- 3. 重寫的Python Mechanize.Browser.open()方法
- 4. 爲什麼我無法在python中重寫此方法?
- 5. 在Ruby中重寫第三方方法
- 6. Python的方法不是重寫
- 7. Python重寫字典訪問方法
- 8. Python方法重寫,簽名問題?
- 9. Python的方法重寫規則
- 10. 重寫方法
- 11. 重寫方法
- 12. 重寫方法
- 13. 在Python中的實例方法中重寫函數
- 14. 在Python中重載方法:更重載
- 15. 中重寫OnbackPressed()方法
- 16. Javascript中的重寫方法
- 17. 重寫方法中的值
- 18. 重寫方法在Java
- 19. 重寫hashCode方法在類
- 20. 在Python中完全重寫屬性訪問的正確方法?
- 21. 如何在Python中不小心重寫一個方法?
- 22. 在Python中重寫Java代碼的pythonic方法
- 23. 如何在Python中重寫PySerial的「__del__」方法?
- 24. 在Python中,我如何表明我重寫了一個方法?
- 25. 構造函數和方法在Python中重寫
- 26. 如何在python中重寫方法默認參數?
- 27. 在Python中重寫屬性
- 28. 方法重載或重寫方法?
- 29. 在重寫方法中如何解決對重寫方法的調用?
- 30. 重寫在python
確切的重複http://stackoverflow.com/questions/728361/is-there-a-way-to-overload-in-python – 2009-12-29 09:29:35
是的,但使用網站搜索:+ = python沒有給出結果。將報價放在「+ =」附近給出結果,但大多數情況下,報紙無法通過頭條新聞來判斷。儘管通過谷歌搜索發現這一點。 – 2010-12-26 21:10:01