Le résultat est le même mais la seconde solution est bien plus simple à écrire et à maintenir.
Pour obtenir le même résultat avec la première méthode, il faut que ta méthode mycopy() liste tous les attributs de ta classe (peut devenir fastidieux s'il y en a beaucoup) et surtout doit réaliser l'opération de manière récursive sur tous les attributs complexes. Explication:
c = C(a=1, b=2)
new_obj = c.mycopy() # OK: la copie est complète
c1 = C(a=1, b=2)
c2 = C(a=1, b=c1)
new_obj = c2.mycopy() # La copie est partielle: l'attribut b n'est pas copié |
Dans la deuxième situation, la copie n'est pas réalisé pour l'attribut b, en voici la preuve en affichant les id des objets:
>>> print id(c1)
140459192950864
>>> print id(c2)
140459192950936
>>> print id(new_obj)
140459192951008
>>> print id(new_obj.b)
140459192950864 |
On voit bien que c1 et new_obj.b indiquent le même objet (même id): la copie doit être réalisée de manière récursive. C'est ce que fait copy.copy() (et probablement plus rapidement par dessus le marché)