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 :

Conseils sur la construction de class et méthodes "génériques" [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut Conseils sur la construction de class et méthodes "génériques"
    Bonjour,

    Je code un peu de temps en temps et je rencontre actuellement une situation qui n'est pas bloquante mais que je ne sais pas affrontée "proprement".

    En gros, je cherche à coder un outil qui permet de connaître les propriétés physiques d'un matériau dans des conditions données.
    Pour cela j'ai créer une classe qui vise a représenter un matériau avec des méthodes qui me permettent de calculer l'évolution de ces propriétés physiques.
    La problématique qui se pose maintenant est que je souhaite que cette class prenne en compte le fait que chaque matériau à des lois de comportement (équations) différentes avec des paramètres différents, que je souhaite pouvoir ajouter de manière assez simple de nouveaux matériaux pour faire une sorte de base de données (idéalement un fichier par matériau que la classe viendrait lire), et c'est là que cela se corse.

    J'espère que ma question est claire, si vous avez des suggestions je suis intéressé

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Si c'était juste des paramètres qui différaient tu pourrais stockés leur valeur dans un dictionnaire par exemple (chaque entrée est un matériau, et les valeurs du dictionnaires serait des listes de valeurs de paramètres (ou des dictionnaires aussi si tu veux que tes paramètres soient nommés)). Ce genre de structure s'exporte ensuite très bien dans un fichier (cf. la librairie json de python).

    Là comme les équations diffèrent c'est un peu plus complexe. Soit tu arrives à créé une équation à partir d'une chaine de caractère par exemple (mais c'est un peu dangereux), et dans ce cas ton équation pourra aussi s'exportée dans un fichier. Soit sinon tu utilises le polymorphisme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Materiau(): 
        pass
     
    class Or(Materiau):
        def comportement(self) :
            #### la loi de comportement de l'or
     
    class Argent(Materiau):
        def comportement(self) :
            #### la loi de comportement de l'argent
     
    class Cuivre(Materiau):
        def comportement(self) :
            #### la loi de comportement du cuivre
    Les méthodes doivent avoir exactement le même prototype (les mêmes arguments). Dans ce cas si dans ton code tu veux changer le matériau, tu n'auras que la ligne où tu construis ton matériau à changer. Le reste du code (notemment l'appel à la méthode de comportement) restera inchangé.

  3. #3
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut
    Merci pour ce retour,
    en effet je n'avais pas pensé à la solution du polymorphisme que je n'ai jamais utilisé jusqu'ici et à l’interprétation d'une chaîne de caractère pour l'équation
    quel est le risque par rapport à cette dernière solution ? peux t on appeler des méthodes de cette manière ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Stocker l'équation dans un fichier c'est donc la stocker sous la forme d'une chaine de caractère. Et ensuite tu feras :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s="def f(x) : return x*x"
    eval(s)
    print(f(5))
    Mais là faudra imaginer que s ne sera pas défini dans ton code, et à fortiori pas juste au dessus de ton instruction eval. Ca sera une chaine de caractère qui proviendra d'un fichier d'input. Donc rien ne te garantira que :
    - cette chaine contient un code python valide
    - cette chaine définisse bien une fonction nommée f, et qui prend exactement un seul paramètre

    Avant l'instruction eval, python ne connait pas f, après oui. Mais si dans la chaine de caractère il n'y a pas ce qu'il faut, ca va être compliqué pour débugger.

    Une solution intermédiaire (pour laquelle j'opterais) serait de donner un nom aux lois. Ainsi dans le fichier au lieu d'écrire la loi, tu écris son nom. Et après en fonction du nom, en python, tu peux aller chercher la loi qu'il faut.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def loi1(x) : return x*x
     
    def loi2(x) : return 2*x
     
    lois = { "nom_loi1":loi1 , "nom_loi2": loi2 }   ### Un dictionnaire de fonction
     
    class Materiau():
       def __init__(self, nom_loi):
              assert( nom_loi in lois ),"Loi inconnue"
              self.nom_loi = nom_loi
     
       def comportement(self,x):
             f = lois[self.nom_loi]  ### On récupère la bonne loi (une fonction)
             return f(x)

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par lg_53 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def loi1(x) : return x*x
     
    def loi2(x) : return 2*x
     
    lois = { "nom_loi1":loi1 , "nom_loi2": loi2 }   ### Un dictionnaire de fonction
    Ici l'utilisation de lambda peut s'avérer utile. Et si les lois appartiennnent à l'objet, alors on peut les intégrer en tant que membre statique de l'objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Materiau():
    	lois={ "nom_loi1": lambda x: x*x , "nom_loi2" : lambda x: x*2 }   ### Un dictionnaire de fonction
    	def __init__(self, nom_loi):
    		assert(nom_loi in Materiau.lois), "Loi inconnue"
    		self.nom_loi = nom_loi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut
    merci lg_53, je pense que ta solution est la bonne
    je vais oublier les eval et je comprend mieux ces défauts avec tes explications

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

Discussions similaires

  1. Conseils sur le choix des Class
    Par nikolas92400 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 21/04/2015, 00h26
  2. Réponses: 1
    Dernier message: 01/06/2011, 23h13
  3. Réponses: 2
    Dernier message: 06/07/2009, 09h45
  4. Conseil sur la construction d'un gros formulaire
    Par billout rm dans le forum InfoPath
    Réponses: 9
    Dernier message: 24/07/2007, 11h29
  5. Conseils sur la méthode de développement objet métier
    Par RamDevTeam dans le forum Langage
    Réponses: 5
    Dernier message: 08/12/2005, 18h14

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