Python __copy__ ve __deepcopy__ metotları neden kullanılır?

Nesneleri copy ve deepcopy sayesinde kopyalayabiliyoruz. Ancak bunun haricinde sınıfların içine copy ve deepcopy (bunlar alt çizgili olacak) yazarak kopyalama işlemini özelleştirebiliyoruz yazılıyor. Özelleştime demekle neyi ifade ediyorlar.
copy ve deepcopy (bunlar alt çizgili olacak) neden kullanılıyor tam olarak açıklayan bir bilgi ve basit bir örnek bulamadım.
Bazı basit örnekler incelendiğinde copy yada deepcopy (bunlar alt çizgili olacak) olan fonksiyonlar silindiğinde hata vermeden kopyalama işlemi gerçekleşiyor. Ne mantığı var ki bu metotları yazıyoruz.

deepcopy hakkında bir iki şey söyleyebilirim. Kod satırlarında herhangi bir listeyi değiştirmemek üzere bir değişkene atamak istersen kullanabilirsin. Normal kopyalama işleminde kod satırlarının herhangi bir yerinde ana listeden bir değişiklik normal kopyalanmayı da etkiliyor deepcopy ile bunu engelleyebilirsiniz.

Benim merak ettiğim aslında alt çizgili olan copy ve deepcopy metotları. Burada yazıyorum ancak o şekilde görünmediği için alt çizgili diye anlatmak istedim.

Hangi copy ve deepcopy? Buradakiler mi? Modülü söylemek lazım.

Markdown’un özelliği, çift ‘_’ arasına alınan kelimeleri kalın yapıyor. Böyle bir şey yazmak istediğinizde yazıyı `` işaretleri arasına alabilirsiniz:

``__copy__`` → __copy__


Nerde yazıyor? Bir dahakine link verin, gerekirse bunun yazdığı bölümü kopyalayıp buraya şu şekilde koyun:

> alıntı

Yukarıdaki yazı şu şekilde gözükecektir:

alıntı

Bunları söylüyorum çünkü deepcopy fonksiyonun ne olduğunu, söylediğiniz şeylerin nerede yazdığını herkes bilmeyebilir; bilmek zorunda da değil zaten.


İstediğimizi yapabileceğimizi:

import copy

class MyClass():

    def __copy__(self):
        return "Copied!"

    def __deepcopy__(self, memo):
        return "Deep copied!"

instance = MyClass()
print(copy.copy(instance))
print(copy.deepcopy(instance))

Kendi sınıflarımızın örneklerinin nasıl kopyalanacağını kontrol etmemiz için.

Çünkü bu metotlar yoksa Python kopyalama işlemini kendi bildiği gibi yapıyor. Ama biz isteyerek bu metodları tanımlarsak kopyalama işlemini bizim istediğimiz gibi yapıyor.

"class MyClass:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.other = [1, 2, 3]

    def __copy__(self):
        new_instance = MyClass(self.x, self.y)
        new_instance.__dict__.update(self.__dict__)
        new_instance.other = copy.deepcopy(self.other)
        return new_instance
my_class = MyClass([1, 2], [3, 4])
my_new_class = copy.copy(my_class)

print(id(my_class))
print(id(my_new_class))

my_class.x[0] = 0
my_class.y[0] = 0
my_class.other[0] = 0
print(my_new_class.x)
print(my_new_class.y)
print(my_new_class.other)
"

Şimdi vermiş olduğum örnekte copy fonksiyonu var. O zaman benim anladığım kopyalama işlemi olduğunda bu fonksiyon çalışacak. Ben bu fonksiyon içerisinde yazdıklarım neyse ona göre işlem yapacaktır değil mi? O yüzden aynı zamanda içerisinde deepcopy yazıldığı için derin bir kopyalama yapılacaktır.

Evet, eğer __copy__ metodunu tanımladıysak copy.copy(var) işlemi var.__copy__() ile eşdeğerdir diyebiliriz.

İlk başta fonksiyon olarak düşünmediğim için kafa karışıklığına sebep oldu. Halbuki çözüm çok basitmiş. Teşekkür ederim

Önemli değil. Çözümü sağlayan gönderinin altındaki “çözüm” bölümüne tıklayabilirsiniz, başlığa eklemenize gerek yok.