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 += 1
tam 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ü b
ve a
aynı 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]
, b
baş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 x
ve y
farklı 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 Foo
uygulanmazsa __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_instance
türü bir alt sınıfı foo_instance
(örneğin issubclass(Bar, Foo)
). Çünkü bunun için rasyonel olan Bar
daha "üst düzey" nesne Bir anlamda olduğu Foo
böylece Bar
geçersiz kılma seçeneği almalısınız Foo
'ın davranışı.
+=
extend()
listelerdeki gibi davranır .