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 :

POO utile dans ce cas ?


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Par défaut POO utile dans ce cas ?
    Bonjour à tous,

    Je découvre le Python et je souhaite faire un petit programme simple.
    C’est pour calculer une des 3 caractéristiques d’un vérin pneumatique.
    Le vérin se définit par son diamètre D, sa pression de service P, sa force F.
    Je connais dans, chaque cas, deux de ces valeurs et je cherche la troisième.
    La relation entre elles est P=F/S avec S=PIxDxD/4

    Est il pertinent d’utiliser la POO ?
    Si, Oui, comment faire ?

    Merci de vote compréhension

    Salutations

  2. #2
    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 Patoche_17 Voir le message
    Est il pertinent d’utiliser la POO ?
    La POO c'est juste une facilité permettant de se simplifier certains problèmes

    Prenons par exemple un truc qui calcule la surface d'un cercle. Facile, tu définis une fonction def surface(r): return 3.14*r**2. Jusque là c'est parfait.

    Puis vient se rajouter la surface d'un carré. Ok déjà il faut une fonction "surface" mais pas de même nom. Donc tu te tortures tes neurones qq secondes pour écrire def surface_c(c): return c**2. Mais là (enfin si tu as envie d'écrire correct) tu te dis que la première n'a plus un nom pertinent et qq secondes plus tard tu arrives à def surface_r(r): return 3.14*r**2.

    Ensuite tu commences à coder. Tu définis un beau rayon de cercle (cercle_rayon=5) puis un beau côté de carré (carre_cote=8). Et puis sais pas, ce carré et ce cercle doivent avoir une couleur (parce que tu vas les dessiner) donc ok cercle_couleur=Qt.Blue et carre_couleur=Qt.Red.
    Bon déjà ça commence à te gonfler de devoir trouver des noms distincts (et on n'en est qu'à 2 trucs). Et paf comme un ennui ne vient jamais seul, là (erreur) tu appelles surface_r(carre_cote) et ton code ne plante pas mais renvoie de mauvaises valeurs. Et comme il fait 300 lignes tu mets 3 ans à trouver le pourquoi du comment.

    Arrive l'objet. Il n'est pas obligatoire, mais simplifiera beaucoup de noeuds au cerveau.
    Déjà un bel objet cercle et un autre carré
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class cercle:
    	def __init__(self, r=0, couleur=None):
    		self.__rayon=r
    		self.__couleur=couleur
    	def surface(self): return 3.14 * self.__rayon**2
    # class cercle
     
    class carre:
    	def __init__(self, c=0, couleur=None):
    		self.__cote=c
    		self.__couleur=couleur
    	def surface(self): return self.__cote**2
    # class carre
    Déjà pour les noms de tes fonctions, pas besoin de te casser le luc. Elles font un travail analogue, elles auront le même nom. Leur appartenance fera la différence. Et dans l'utilisation...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    r=cercle(5, Qt.Blue)
    c=carre(8, Qt.Red)
    print("Surface carré: %d" % c.surface())
    print("Surface cercle: %d" % r.surface())
    Tu ne peux plus faire d'erreur car la fonction adéquate est automatiquement appelée selon la nature de l'objet.

    La POO n'est pas nécessaire (on peut très bien s'en passer) mais aide parfois pas mal.

    Donc la réponse à ta question dépend surtout du contexte. Est-ce que tu utilises ton vérin tout seul ou bien avec d'autres trucs?

    Citation Envoyé par Patoche_17 Voir le message
    Si, Oui, comment faire ?
    Bah...
    Code python : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #!/usr/bin/env python3
     
    class verin:
    	def __init__(self, pi=0, diametre=None, pression=None, force=None):
    		self.__pi=pi
    		self.__d=diametre
    		self.__p=pression
    		self.__f=force
    	# __init__()
     
    	def __calcP(self): return (4*self.__f) / (self.__pi * self.__d**2)
    	def __calcF(self): return (self.__pi * self.__d**2 * self.__p) / 4
    	def __calcD(self): return 2* (self.__f / (self.__pi*self.__p)) ** 0.5
     
    	def carac(self):
    		res={
    			"diametre" : self.__d,
    			"pression" : self.__p,
    			"force" : self.__f,
    		}
    		calc={
    			"diametre" : self.__calcD,
    			"pression" : self.__calcP,
    			"force" : self.__calcF,
    		}
     
    		if (self.__d, self.__p, self.__f).count(None) != 1:	# S'il manque plus d'une valeur ou si on a toutes les valeurs...
    			return res					# Tant pis (ou tant mieux), de toute façon on peut pas calculer
     
    		for k in res.keys():
    			# Si on a une valeur manquante
    			if res[k] is None:
    				# On la calcule et c'est fini
    				res[k]=calc[k]()
    				break
    			# if
    		# for
     
    		# On renvoie le résultat calculé
    		return res
    	# carac()
     
    	def __str__(self):
    		return "pi=%f, force=%s, diametre=%s, pression=%s" % (self.__pi, self.__f, self.__d, self.__p)
    # class verin
     
    v0=verin(pi=5, pression=7, force=12, diametre=4)	# Le verrin témoin
    vd=verin(pi=5, pression=7, force=12)			# Il lui manque le diamètre
    vp=verin(pi=5, diametre=4, force=12)			# Il lui manque la pression
    vf=verin(pi=5, diametre=4, pression=7)			# Il lui manque la force
    print("v0: %s => %s" % (v0, v0.carac()))
    print("vd: %s => %s" % (vd, vd.carac()))
    print("vp: %s => %s" % (vp, vp.carac()))
    print("vf: %s => %s" % (vf, vf.carac()))

    C'est vrai que quand on utilise la POO, on peut aussi se lacher à faire les trucs en grand...
    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]

  3. #3
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Par défaut
    Bonjour,

    Merci pour la réponse. Elle va même au delà de ma question.
    Je vais maintenant décortiquer pour mieux comprendre.

    Salutations

  4. #4
    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
    Citation Envoyé par Patoche_17 Voir le message
    Merci pour la réponse. Elle va même au delà de ma question.
    Parce que la question manquait de précisions sur le contexte. Donc obligé de ratisser large

    Si maintenant c'est juste un truc de rien, une simple fonction suffit. Surtout que Python est assez souple pour permettre de créer des fonctions assez intelligentes qui font tout en un. Par exemple...
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    def calcul(pi, *, pression=None, force=None, diametre=None):
    	# S'il manque plus d'une valeur ou si on a toutes les valeurs on ne fait rien
    	if (pression, force, diametre).count(None) != 1: return None
     
    	# Balayage des éléments
    	for (tag, x, fct) in (
    		("pression", pression, lambda: (4*force) / (pi * diametre**2)),
    		("force", force, lambda: (pi * diametre**2 * pression) / 4),
    		("diametre", diametre, lambda: 2 * (force / (pi * pression)) ** 0.5),
    	):
    		# Si l'élément manque on retourne la fonction effectuant son calcul
    		if x is None: return {tag : fct()}
    	# for
    # calcul()
     
    print("vd: %s" % calcul(5, pression=7, force=12))
    print("vp: %s" % calcul(5, diametre=4, force=12))
    print("vf: %s" % calcul(5, diametre=4, pression=7))
    Voilà. Elle détecte ce qui manque, le calcule et le renvoie...
    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]

  5. #5
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Par défaut
    Bonsoir,

    Pas encore eu le temps de prendre connaissance de ton deuxième post.

    Sur le premier, il y a un truc que je ne comprends pas c'est :

    for k in res.keys():

    D'où sort le "k" ?
    Ne doit on pas le déclarer ou l'initialiser ?

    Je suppose que .keys() est une propriété de la classe "verin" mais je n'en suis pas certain ?

    Autre question :
    Il t'as fallut combien de temps pour écrire le petit bout d'exemple utilisant la poo sur le premier post ?

    Salutations

  6. #6
    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
    Citation Envoyé par Patoche_17 Voir le message
    for k in res.keys():

    D'où sort le "k" ?
    C'est une variable que je crée.

    Citation Envoyé par Patoche_17 Voir le message
    Ne doit on pas le déclarer ou l'initialiser ?
    La nommer fait office de déclaration. Son initialisation est faite via le "in"

    Citation Envoyé par Patoche_17 Voir le message
    Je suppose que .keys() est une propriété de la classe "verin" mais je n'en suis pas certain ?
    Propriété du dictionnaire "res" => ça donne la liste de ses clefs (ici les strings "diametre", "pression" et "force"). C'est pour ça d'ailleurs que la variable se nomme "k" (consensus chez les dev Python => une clef de dictionnaire s'itère dans "k" et une valeur dans "v" => for v in res.values()).
    Ca aurait été une propriété de la classe "verin" on y accédait alors via self => self.truc(). Là ".keys()" est mis après "res" donc c'est une propriété de "res".

    Citation Envoyé par Patoche_17 Voir le message
    Autre question :
    Il t'as fallut combien de temps pour écrire le petit bout d'exemple utilisant la poo sur le premier post ?
    Euh... j'ai commencé à l'écrire en live mais au bout de 3mn ça m'a gonflé alors j'ai ouvert un script. Le temps d'établir les formules à partir de P=F/S avec S=PIxDxD/4 et tout taper c'était fini en 10mn.
    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]

  7. #7
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Par défaut
    Bonsoir,

    Merci de ta disponibilité.

    Bye

  8. #8
    Invité
    Invité(e)
    Par défaut
    Salut !

    for k in res.keys():

    D'où sort le "k" ?
    Ah !
    Si vous ne comprenez pas d'où sort le "k" vous avez grillé beaucoup d'étapes !
    Il faut commencer par les bases, la POO perso je ne l'utilise quasiment jamais dans mes petits projets...


    @Sve@r Et ton trophée, au faite ? Après tout ce que tu fais... Révolution !!!

  9. #9
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Par défaut
    Bonjour,

    Citation Envoyé par LeNarvalo Voir le message
    Salut !
    Si vous ne comprenez pas d'où sort le "k" vous avez grillé beaucoup d'étapes !
    Il faut commencer par les bases, la POO perso je ne l'utilise quasiment jamais dans mes petits projets...
    C'est vrai

    Salutations

Discussions similaires

  1. z-index utile dans mon cas ?
    Par macbida dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 03/10/2012, 09h38
  2. [ZF 1.9] Zend utile dans mon cas ?
    Par Haxor668 dans le forum Zend Framework
    Réponses: 6
    Dernier message: 19/09/2009, 09h19
  3. CMS utile dans mon cas ?
    Par lbrun79 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 21/10/2007, 22h02
  4. [RegEx] Utiles dans mon cas?
    Par lutecefalco dans le forum ASP.NET
    Réponses: 12
    Dernier message: 03/08/2007, 15h55
  5. [Débutant] XML utile dans ce cas?
    Par anna3524 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 31/01/2007, 14h36

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