Bu tamamen nesneye bağlıdır i.
+=aramaları __iadd__yöntemi (varsa - ile geri düşme __add__mevcut değil ise) ise +aramalar __add__yöntem 1 veya __radd__bazı durumlarda yöntem 2 .
Bir API perspektifinden bakıldığında, mutasyona uğramış __iadd__nesneleri yerinde değiştirmek (mutasyona uğramış nesneyi döndürmek) için kullanılırken, __add__bir şeyin yeni bir örneğini döndürmek gerekir . İçin değişmez nesneler, her iki yöntem yeni bir örnek dönmek fakat __iadd__eski örneği vardı, aynı adla geçerli ad alanında yeni bir örneğini koyacağız. Bu nedenle
i = 1
i += 1
artmış gibi görünüyor i. Gerçekte, yeni bir tamsayı alır ve bunu "üstüne" atarsınız i- eski tamsayıya bir referans kaybedersiniz. Bu durumda, i += 1tam olarak aynıdır i = i + 1. Ancak, değişebilir nesnelerle, bu farklı bir hikaye:
Somut bir örnek olarak:
a = [1, 2, 3]
b = a
b += [1, 2, 3]
print a #[1, 2, 3, 1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]
nazaran:
a = [1, 2, 3]
b = a
b = b + [1, 2, 3]
print a #[1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]
ihbar nasıl ilk örnekte, çünkü bve aaynı nesneye başvuran, ben kullandığınızda +=üzerinde b, aslında değişir b(ve açok bu değişikliği görür - Sonuçta, aynı listeyi referans oluyor). Ancak ikinci durumda, bunu yaptığımda b = b + [1, 2, 3], bbaşvurulan listeyi alır ve yeni bir listeyle birleştirir [1, 2, 3]. Daha sonra sıralı listeyi geçerli ad alanında b- Daha bönce satırın ne olduğuna bakmaksızın - olarak saklar .
1 ifadede x + y, eğer x.__add__uygulanmadı veya eğer x.__add__(y)döner NotImplemented ve xve yfarklı türleri vardır , o zaman x + yçağrı çalışır y.__radd__(x). Yani, sahip olduğunuz durumda
foo_instance += bar_instance
eğer Foouygulanmazsa __add__veya __iadd__o zaman buradaki sonuç aynı
foo_instance = bar_instance.__radd__(bar_instance, foo_instance)
2 ifadesinde foo_instance + bar_instance, bar_instance.__radd__yargılanabileceklerdir foo_instance.__add__ halinde tipi bar_instancetürü bir alt sınıfı foo_instance(örneğin issubclass(Bar, Foo)). Çünkü bunun için rasyonel olan Bardaha "üst düzey" nesne Bir anlamda olduğu Fooböylece Bargeçersiz kılma seçeneği almalısınız Foo'ın davranışı.
+=extend()listelerdeki gibi davranır .