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

Calcul scientifique Python Discussion :

héritage de classe, pyhton Numeric


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut héritage de classe, pyhton Numeric
    Bonjour,
    J'ai un petit devoir de modélisation à réaliser et j'aurai besoin d'une classe qui ressemblerait au type 'array' du module Numeric, avec deux ou trois attributs en rab'.....
    Cependant, quand je fais hériter ma classe de 'array':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Matrice(Numeric.ArrayType):
        def __init__(self,densite,taille):
        	Numeric.ArrayType.__init__(self,[])
    voila le retour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TypeError: Error when calling the metaclass bases
        type 'array' is not an acceptable base type

    Si vous savez ce que signifie "non acceptable", merci d'avance!

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Première chose, il faut utiliser NumPy maintenant plutôt que Numeric. Il me semble ensuite qu'on est obligé de passer par __new__

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class toto(numpy.ndarray):
        def __new__(self, data):
            new = numpy.array(data, 'i').view(self)
            return new
    avec les anciens modules Numeric et Numarray, il fallait faire autrement (enfin, je ne veux pas dire de bêtise, ca fait un bout de temps que j'ai migrer sur NumPy) par appel d'une fonction

    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
    import numarray as N
    import numarray.numarraycore as _nc
     
    def _toto(result):
        result.__class__ = classetoto
        return result
     
    def toto(*args, **keys):
        return _toto(_nc.array(*args, **keys))
     
    def totoOnes(*args, **keys):
        return _toto(_nc.ones(*args, **keys))
     
    def totofromlist(*args, **keys):
        return _toto(_nc.fromlist(*args, **keys))
     
    def totofromfile(*args, **keys):
        return _toto(_nc.fromfile(*args, **keys))
     
    class classetoto(_nc.NumArray):
        ...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut
    tout d'abord merci de ton aide guigui.
    je ne suis pas sur d'avoir le droit d'utiliser numpy pour le devoir (un prof un petit peu .....disons bizarre).Mais en attendant une réponse de ce dernier j'aimerai comprendre: pourquoi est-on obligé d'utiliser __new__?le problème étant que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class toto(numpy.ndarray):
        def __new__(self, data):
            new = numpy.array(data, 'i').view(self)
            return new
         def methode(self)
            ....
    renvoie un objet de tye numpy.ndarray, et donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bidule=toto(data)
    bidule.methode()
    renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'numpy.ndarray' object has no attribute 'methode'

    et du coup même problème si on rajoute des attributs à toto dans la méthode __new__

  4. #4
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    normale, il faut écrire

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut
    oui pardon c'est une erreur de frappe, je corrige ça tout de suite...
    en fait, mon problème est que ma classe doit etre très légère car elle va etre instanciée plusieurs centaines de fois au moins (la joie des statistiques.....).
    Donc au lieu de creer une classe qui contient un objet de type array, ce que j'ai fait pour l'insant, il faudrait que la classe elle-même dérive de array....
    aurais-tu une idée?

  6. #6
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    avec numpy et la méthode proposée, tu as bien un objet qui dérive d'un type array ?

    avec numarray:
    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
    import numarray as N
    import numarray.numarraycore as _nc
     
    def _myarray(result):
        result.__class__ = classemyarray
        return result
     
    def myarray(*args, **keys):
        return _myarray(_nc.array(*args, **keys))
     
     
    class classemyarray(_nc.NumArray):
        def methode(self): print self
     
    a = myarray([1,2,3])
    print a
    a.methode()
    print type(a)
    print isinstance(a, _nc.NumArray)
    je suppose qu'avec Numeric, ca fonctionne comme avec numArray (j'en suis pas certain).
    Dans tous les cas, Numeric et numarray sont obsolètes, il est mieux de travailler avec numpy

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

Discussions similaires

  1. conflit d'inclusions et Héritage de classe
    Par gedeon555 dans le forum C++
    Réponses: 7
    Dernier message: 01/10/2006, 19h48
  2. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 16h00
  3. Héritage de classes.
    Par Berzerk_ dans le forum C++
    Réponses: 48
    Dernier message: 13/08/2006, 23h48
  4. [POO] Héritage vs classe dans une classe
    Par robichou dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2006, 23h51
  5. [OO] Héritage - Mixins Classes
    Par djmalo dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 01/03/2005, 23h16

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