IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

copy.deepcopy et AttributeError


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut copy.deepcopy et AttributeError
    Bonjour,

    J'ai un soucis avec l'utilisation de la fonction copy.deepcopy : la copie de l'instance de la classe décrite ci-dessous ne possède pas les attributs de l'original :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    # -*- coding: utf8 -*-
     
    import numpy
    import copy
     
    class Referentiel(numpy.ndarray):
        def __new__(subtype, nom_element, data):
     
            try:
                assert len(data) == 6
            except AssertionError:
                raise ValueError, u"Erreur : l'argument 'data' de la classe 'Referentiel' doit etre une liste de longueur 6"
     
            if isinstance(data, Referentiel):
                return data
     
            arr = numpy.array([float(i) for i in data])
            return numpy.ndarray.__new__(Referentiel, shape=6, dtype=float, buffer=arr)
     
        def __init__(self, nom_element, data):
     
            self.element = nom_element
     
     
    if __name__ == "__main__":
     
        ref = Referentiel("test", [1, 2, 3, 4, 5, 6])
        ref2 = copy.deepcopy(ref)
     
        if hasattr(ref, "element"): print "ref a un attribut 'element'"
        if not hasattr(ref2, "element"): print "ref2, copie de ref, n'a pas d'attribut 'element'"
    Est-ce que quelqu'un a déjà rencontré ce problème ?
    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    D'après ce que je peux lire ici, sous-classer ndarray n'est pas une mince affaire. On dirait qu'il faut créer une méthode __array_finalize__ pour initialiser les éléments copiés.
    En tout cas en ajoutant cette méthode à ta classe, cela semble fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def __array_finalize__(self,obj):
            self.element = getattr(obj, 'element', None)
    Mais je suis certain qu'il y a des subtilités que je n'ai pas compris.

  3. #3
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut
    Effectivement ça fonctionne.
    C'est la première fois que je rencontre le cas, j'aurais jamais trouvé...

    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de copie d'un objet psycopg2 via deepcopy
    Par Sve@r dans le forum Général Python
    Réponses: 12
    Dernier message: 06/08/2012, 22h00
  2. [deepCopy] copie les elements d'un tableau
    Par ZaaN dans le forum C#
    Réponses: 1
    Dernier message: 07/04/2008, 22h55
  3. Protéger une disquette contre la copie
    Par benzaza dans le forum Assembleur
    Réponses: 20
    Dernier message: 16/01/2005, 10h42
  4. Copie de fichier
    Par Bjorn dans le forum C
    Réponses: 4
    Dernier message: 11/06/2002, 15h23
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo