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 :

Créer une classe


Sujet :

Python

  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Créer une classe
    Bonjour

    la notion de class héritage .... pas toujours évident.


    J'ai un fichier contenant une entete struture , suivi de 1 à n ligne détail et clos par un structure de fin. Je veux créer les objets python en rapport.
    J'ai donc commencer a constuire des class pour structurer les 3 type d'enregistrement.
    Mais je bus sur la derniere structure.

    Au finale le but est de lire une ficher base sur cette structure pour creer une base de donnée SQLLITE.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    '''
    Created on 1 avr. 2019
     
    @author: me 
    '''
    from dataclass_csv import DataclassReader, dateformat
     
    from dataclasses import dataclass
    from builtins import int, str
    from _datetime import datetime, date
    from _ast import Str
     
    @dataclass
    @dateformat('%d/%m/%Y') 
    class Entete_Fic(object):
        '''
        classdocs
        
        '''
        Typligne  : str  ="000"  # Doit être renseigné avec la valeur 000 
        Creerle   : datetime
        Numclient : str
        NumSequence : int
        TypeFic : str
     
    @dataclass
    @dateformat('%d/%m/%Y') 
    class Fin_Fic(object):
        '''
        classdocs
        
        '''
        Typligne  : str  ="999"  # Doit être renseigné avec la valeur 999 
        Creerle   : datetime
        Numclient : str
        NumSequence : int
        TypeFic : str
        nbligne : int
     
    @dataclass
    @dateformat('%d/%m/%Y')      
    class Type_444():
        '''
        classdocs
        
        '''
        Typligne  : str  ="999"  # Doit être renseigné avec la valeur 999 
        nom :str
        prenom : str
        age : datetime
        rang : str
        lien_famille : str
        Date_ouverture : datetime
        Date_fermeture :datetime = None  # non renseigner par defaut
     
    @dataclass   
    class fichier_mon():
        Id_entete : Entete_Fic
        Id_detail : []
        Id_fin : Fin_Fic
     
        def add_Id_detailk(self, Type_444):
            self.Id_detail.append(Type_444)



    mon probléme est la classe 'fichier_mon' qui doit refléter la structure de ce fichier plat.

    J'ai créer le programme qui lit le fichier nottament les ligne détail est construite la base de donnée mais le principe de ce programme est de lire chaque ligne de Type_444 et bascule en les donnée ligne par ligne.

    JE veux basculer l'opération pour l'insertion des données dans la base de donnée slqlite les données soit charger par bloc.
    Je cherche donc a passer par un chargement des doonné en memoire pour écrire 10 ou 20 en ligne en insertion multiples

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par dedalios Voir le message
    mon probléme est la classe 'fichier_mon' qui doit refléter la structure de ce fichier plat.
    Vous devriez jeter un œil à Django et à SQLAlchemy qui réalisent cela via des metaclass.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Vous devriez jeter un œil à Django et à SQLAlchemy qui réalisent cela via des metaclass.

    - W
    Visblement SQLAlchemy permet l'interface avec des bases de données

    Mais lorsque je regarde ce a quoi sert Django 'Django est un cadre de développement web open source en Python. Il a pour but de rendre le développement web 2.0 simple et rapide. " j'ai plus de difficulté a voir la relation avec la création de class et la lecture de fichier "plat"

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Tous deux utilisent des class "declaratives" pour refléter le schéma d'une table de SGDB.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  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 dedalios Voir le message
    la notion de class héritage .... pas toujours évident.

    J'ai un fichier contenant une entete struture , suivi de 1 à n ligne détail et clos par un structure de fin. Je veux créer les objets python en rapport.
    Peut-être parce que ton besoin n'a pas besoin d'héritage.

    Il faut bien comprendre que l'héritage représente une caractérisation "spécifique" d'un objet. Par exemple un objet "véhicule" (qui contiendra des informations générales à tout véhicule comme par exemple "couleur" ou "marque" ou "propriétaire") pourra se caractériser en "voiture" et/ou en "bateau". Ces objets particuliers hériteront des informations générales et pourront avoir des informations dédiées à leur spécificités (nb de roues pour le premier, port d'attache pour le second).
    Mais ça fonctionne uniquement parce qu'une voiture ou un bateau est bien un véhicule à la base.

    Toi, tu as un fichier contenant 3 types d'informations différentes. Ben là, il n'y a pas d'héritage.
    En effet, que veux-tu faire hériter ? L'en-tête n'a pas besoin d'hériter du fichier car un "en-tête" ce n'est pas un fichier. De même pour la ligne ou la fin. Rien de tout ça ne sont du "fichier". Ils sont peut-être "inclus" dans le fichier mais ce ne sont pas des objets "fichier". A la limite, si tu veux avoir à tout prix un héritage, tu peux créer un objet "data" qui représente une data du fichier puis faire hériter ces 3 objets "en-tête", "ligne" et "fin" de "data" car oui, ce sont toutes trois des datas... mais ce ne sont pas des fichiers.

    Donc tu peux faire par exemple ceci
    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
    class cData(object):
        ... (tout ce qui est commun aux datas, comme par exemple le n° de ligne)..
     
    class cTete(cData):
        ... (tout ce qui est spécifique à l en-tête)...
     
    class cLigne(cData):
        ... (tout ce qui est spécifique à la ligne)...
     
    class cFin(cData):
        ... (tout ce qui est spécifique à la fin)...
     
    class cFichier(object):
        ... (tout ce qui caractérise le fichier, comme par exemple son nom, sa taille, etc etc)...
     
        def __init__(self, ...):
            tete=cTete(...)
            lignes=[clignes(),] * nb_lignes
            fin=cFin()
        # __init__()
    # cFichier()

    Bref ce n'est pas parce qu'un trucA est inclus dans un trucB que trucA hérite de trucB...
    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 éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    merci

    Reste cette partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class cFichier(object):
        ... (tout ce qui caractérise le fichier, comme par exemple son nom, sa taille, etc etc)...
    
        def __init__(self, ...):
            tete=cTete(...)
            lignes=[clignes(),] * nb_lignes
            fin=cFin()
    J'ai quelque difficulté a comprendre cette partie lignes=[clignes(),]
    Autre point Comment avoir connaissance de la valeur de nb_lignes qui n'est pas defini dans ton exemple.

  7. #7
    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 dedalios Voir le message
    J'ai quelque difficulté a comprendre cette partie lignes=[clignes(),]
    C'est une syntaxe permettant de créer directement un tableau de n "trucs". Plutôt que d'écrire for i in range(n): tab.append(truc) tu écris tab=[truc,] * n. Ca "multiplie" n fois "truc" dans tab quoi.

    Citation Envoyé par dedalios Voir le message
    Autre point Comment avoir connaissance de la valeur de nb_lignes qui n'est pas defini dans ton exemple.
    Ah ben attends, mon exemple était là pour illustrer l'idée. Tu as dit "J'ai un fichier contenant une entete struture , suivi de 1 à n ligne détail... et je veux une classe reflétant ce fichier". J'ai donc créé une classe contenant "n" lignes. Je présume bien entendu que tu as connaissance (ou un moyen de connaitre) ce "n" bien évidemment.
    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]

  8. #8
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Ah ben attends, mon exemple était là pour illustrer l'idée. Tu as dit "J'ai un fichier contenant une entete struture , suivi de 1 à n ligne détail... et je veux une classe reflétant ce fichier". J'ai donc créé une classe contenant "n" lignes. Je présume bien entendu que tu as connaissance (ou un moyen de connaitre) ce "n" bien évidemment.
    Bien que la régle établi dans la structure des entêtes soit porteuse du nombre d'enregistrement, la realité peut faire démentir ce fait et il est preferable de ne pas se limite a une valeur présuposé.

  9. #9
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Voici un test
    Voici un exemple qui cherche a s'inpirer de ton principe Sve@r


    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    # coding: utf-8 
    """
    VOici les caratéristiques primaires et leur secondaire.
    Chair : Cet aspect représente la vigueur, la puissance du corps et sa beauté.
            Déplacement : Capacité du personnage à se déplacer vite et gracieusement.
            Force : Puissance brute du personnage et ce qu’il est capable de soulever.
            Endurance : Résistance du personnage à la fatigue, aux maladies, poisons, climats.
     
    Bête : Cet aspect représente les instincts du personnage et l’acuité de ses sens.
            Hargne : Combativité du personnage, son courage face à l’adversité.
            Combat : Utilisé dans toutes les formes de combat au contact.
            Instinct : Intuition du personnage, ses réflexes, son sens de l’orientation.
            
    Machine : Cet aspect représente l’intellect froid et mécanique,la capacité à raisonner et à mémoriser.
            Tir : Talent qu’a le personnage pour manipuler des armes de tir ou de lancer.
            Savoir : Ensemble des savoirs académiques et scientifiques du personnage ainsi que les soins.
            Technique : Connaissances et aptitudes techniques du personnage.
            
            
    Dame : Cet aspect est le charme et le charisme, la capacité à séduire et à parler en public.
            Aura : Magnétisme du personnage, son charisme brut, son charme.
            Parole : Capacité qu’a le personnage à bien parler, convaincre, à décrire, à conter.
            Sang-Froid : Volonté du personnage, sa capacité à contrôler l’ensemble de ses émotions.
     
    Masque : Cet aspect symbolise la capacité à être discret, à mentir, à trahir.
            Discrétion : Capacité qu’a le personnage à dissimuler des choses et à se dissimuler.
            Dextérité : L’adresse, la souplesse et le doigté du personnage.
            Perception : Qualité des sens du personnage, son empathie, sa capacité d’analyse.
     
    La valeur des caractéristques secondaires ne peuvent pas être suppérieur à la caractéristique primaire.
    Toute valuation de celle-ci doit donc être conditionnée.
    Chair -->  caractéristque primaire
            Déplacement --> caractéristque dépendante de Chair
            Force --> caractéristque dépendante de Chair
            Endurance --> caractéristque dépendante de Chair
            
            
    """	
     
    from dataclasses import dataclass
     
     
    @dataclass
    class caracteristique_secondaire(object):
    	nom : str
    	description : str
    	niveau : int 
     
     
     
    @dataclass
    class caracteristique_primaire(object):
    	nom : str
    	description : str
    	niveau : int 
    	car_secondaire : [caracteristique_secondaire(),] * 3
     
     
     
    class caracteristique_primair_(nom,description,niveau):
    	def __init__(self, nom,description,niveau,car_secondaire):
    		self.nom  = nom
    		self.description= description
    		self.niveau  =niveau
    		self.car_secondaire  =[]
    		for i in range(3):tab.append(carecteristique_secondaire)
     
     
     
    if __name__ == '__main__':
    	car_deplacement = caracteristique_secondaire('Déplacement',None,0)
    	car_deplacement.description = 'Capacité du personnage à se déplacer vite et gracieusement.'
    	car_force =  caracteristique_secondaire('Force',None,0)
    	car_force.description  = 'Puissance brute du personnage et ce qu’il est capable de soulever.'
    	car_endurance = caracteristique_secondaire('Endurance',None,0)
    	car_endurance.description = 'Résistance du personnage à la fatigue, aux maladies, poisons, climats.'
     
    	print(car_endurance)
     
    	#car_chair = caracteristique_primair_('Chair',None,0)
    	print(car_chair)
    	car_chair.description = 'Cet aspect représente la vigueur, la puissance du corps et sa beauté.'
     
    	car_chair2 =  caracteristique_primaire('Chair',None,0)
    mais voila


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    car_chair = caracteristique_primair_('Chair',None,0)
     
    car_chair2 =  caracteristique_primaire('Chair',None,0)

    Traceback (most recent call last):
    -->\eclipse-workspace\PYKNIGHT\caracteristique.py", line 52, in <module>
    class caracteristique_primaire(object):
    -->\eclipse-workspace\PYKNIGHT\caracteristique.py", line 56, in caracteristique_primaire
    car_secondaire : [caracteristique_secondaire(),] * 3
    TypeError: __init__() missing 3 required positional arguments: 'nom', 'description', and 'niveau'

    ce qui semble logique puisque l'on ne dispose pas des informations

  10. #10
    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 dedalios Voir le message
    Voici un exemple qui cherche a s'inpirer de ton principe Sve@r... mais voila


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
    -->\eclipse-workspace\PYKNIGHT\caracteristique.py", line 52, in <module>
    class caracteristique_primaire(object):
    -->\eclipse-workspace\PYKNIGHT\caracteristique.py", line 56, in caracteristique_primaire
    car_secondaire : [caracteristique_secondaire(),] * 3
    TypeError: __init__() missing 3 required positional arguments: 'nom', 'description', and 'niveau'
    Alors le souci c'est que je ne connais pas le décorateur "dataclass". Mais d'après ce que je vois, l'objet "caractérisitique secondaire" a besoin de 3 paramètres (nom, description, niveau). Donc fatalement quand tu crées son instance, tu dois lui passer ces 3 infos.

    Citation Envoyé par dedalios Voir le message
    ce qui semble logique puisque l'on ne dispose pas des informations
    Oui mais bon, là encore quand j'ai écrit mon exemple, c'était juste illustratif pour te montrer l'idée générale (un objet qui peut inclure d'autres objets sans forcément avoir besoin d'en hériter). Lorsque tu le mets en application, tu es toi obligé de combler les blancs. Mais ces blancs ne sont pas sensés y être pusque toi, qui es maitre de ton truc, tu dois donc les avoir ces informations.

    Si maintenant ces informations ne sont pas immédiatement accessibles mais doivent être d'abord récupérées avant d'être transmises à la création de l'instance "caractéristiques secondaire", déjà tu ne peux plus utiliser le raccourci tab=[objet(),] * n (puisque "objet" attend des paramètres que tu n'as pas) donc tu es obligé de revenir à un truc plus classique style
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tab=[]
    for i in range(n):
        nom=...(récupération du nom)...
        description=...(récupération de la description)...
        niveau=...(récupération du niveau)...
        tab.append(objet(nom, description, niveau))
    # for
    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]

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    Je verrai bien la notion de classe abstraite pour ce genre de problème, voir le module ABC.

  12. #12
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495

  13. #13
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut plus classic mais ne semble pas fonctionner
    bonjour
    je suis revenu a une méthode plus classic de définition

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # coding: utf-8 
     
     
    class caracteristique_secondaire(object):
    	def __init__(self, nom , description , niveau):
    		self.nom  = nom
    		self.description = description
    		self.niveau  = niveau
    	def __str__(self):
    		 retour = self.nom + ': ' + str(self.niveau)
    		 return retour
     
     
    class caracteristique_primaire(object):
    	def __init__(self, nom , description , niveau):
    		self.nom  = nom
    		self.description= description
    		self.niveau  =niveau
    		self.car_secondaire  = []
     
    	def __str__(self):	
    		 retour = self.nom + ': ' + str(self.niveau) + '\n'
    		 for car in self.car_secondaire:
    		 	retour += car. __str__+ '\n'
    		 return retour
     
    	def ajouter_car_secondaire(self,car_sec):
                   self.car_secondaire.append(car_sec )
     
     
    if __name__ == '__main__':
    	car_deplacement = caracteristique_secondaire('Déplacement',None,2)
    	car_deplacement.description = 'Capacité du personnage à se déplacer vite et gracieusement.'
     
    	car_force =  caracteristique_secondaire('Force',None,1)
    	car_force.description  = 'Puissance brute du personnage et ce qu’il est capable de soulever.'
     
    	car_endurance = caracteristique_secondaire('Endurance',None,3)
    	car_endurance.description = 'Résistance du personnage à la fatigue, aux maladies, poisons, climats.'
     
    	car_chair = caracteristique_primaire('Chair',None,7)
    	car_chair.description = 'Cet aspect représente la vigueur, la puissance du corps et sa beauté.'
    	ajouter_car_secondaire.car_chair(car_force)
    	ajouter_car_secondaire.car_chair(car_deplacement)
    	ajouter_car_secondaire.car_chair(car_endurance)
     
     
    	print(car_force)
    	print(car_deplacement)
    	print(car_endurance)
    	print(car_chair)
    mais voila le programme à son exécution et comme eclipse ils ne voient ni l'un ni l'autre la méthode ajouter_car_secondaire
    Traceback (most recent call last):
     "eclipse-workspace\PYKNIGHT\caracteristique.py", line 80, in <module>
        ajouter_car_secondaire.car_chair(car_force)
    NameError: name 'ajouter_car_secondaire' is not defined

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par dedalios Voir le message
    je suis revenu a une méthode plus classic de définition
    Ben, il faut (re)ouvrir le chapitre de votre tuto. préféré qui raconte comment sont définies et utilisables les méthodes d'une instance.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    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 dedalios Voir le message
    mais voila le programme a son exécution et comme eclipse ils ne voient ni l'un ni l'autre la méthode ajouter_car_secondaire
    La syntaxe d'appel d'une méthode c'est instance.methode() et non methode.instance()... !!!
    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]

  16. #16
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut bonjour voici l'erreur une petite erreur de code
    bonjour voici l'erreur une petite erreur de code (merci j'ai vue effectivement mon erreur apres avoir ouvert ces cas)

    anomalie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            ajouter_car_secondaire.car_chair(car_force)
            ajouter_car_secondaire.car_chair(car_deplacement)
            ajouter_car_secondaire.car_chair(car_endurance)
    correction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	car_chair.ajouter_car_secondaire(car_force)
    	car_chair.ajouter_car_secondaire(car_deplacement)
    	car_chair.ajouter_car_secondaire(car_endurance)
    autre erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	def __str__(self):	
    		 retour = self.nom + ': ' + str(self.niveau) + '\n'
    		 for car in self.car_secondaire:
    		 	retour += car. __str__() '\n'
    return retour
    correction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	def __str__(self):	
    		 retour = self.nom + ': ' + str(self.niveau) + '\n'
    		 for car in self.car_secondaire:
    		 	retour += car. __str__()+ '\n'
    		 return retour

  17. #17
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut meme version avec dataclass
    L'utilisation du décorateur dataclass pose problème (peut être n'est pas prévu par python 3.7.3..)

    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
    33
    from dataclasses import dataclass
     
     
    @dataclass
    class caracteristique_secondaire(object):
    	nom : str
    	description : str
    	niveau : int 
     
    @dataclass
    class caracteristique_primaire(object):
    	nom : str
    	description : str
    	niveau : int 
    	car_seccondaire : []
     
    	def ajouter_car_secondaire(self,car_sec):
    		self.car_secondaire.append(car_sec )
     
    if __name__ == '__main__':
    	car_deplacement = caracteristique_secondaire('Déplacement',None,2)
    	car_deplacement.description = 'Capacité du personnage à se déplacer vite et gracieusement.'
    	car_force =  caracteristique_secondaire('Force',None,1)
    	car_force.description  = 'Puissance brute du personnage et ce qu’il est capable de soulever.'
    	car_endurance = caracteristique_secondaire('Endurance',None,3)
    	car_endurance.description = 'Résistance du personnage à la fatigue, aux maladies, poisons, climats.'
    	car_chair = caracteristique_primaire('Chair',None , 7)
    	car_chair.description = 'Cet aspect représente la vigueur, la puissance du corps et sa beauté.'
    	car_chair.ajouter_car_secondaire(car_force)
    	car_chair.ajouter_car_secondaire(car_deplacement)
    	car_chair.ajouter_car_secondaire(car_endurance)
     
    	print(car_chair)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "caracteristique2.py", line 67, in <module>
        car_chair = caracteristique_primaire('Chair',None , 7)
    TypeError: __init__() missing 1 required positional argument: 'car_seccondaire'

    La modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	car_chair = caracteristique_primaire('Chair',None , 7 , None)
    pose problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "caracteristique2.py", line 67, in <module>
        car_chair.ajouter_car_secondaire(car_force)
      File "caracteristique2.py", line 56, in ajouter_car_secondaire
        self.car_secondaire.append(car_sec )
    AttributeError: 'caracteristique_primaire' object has no attribute 'car_secondaire'

  18. #18
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Plus compact serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def __str__(self):
             s = '\n'.join(str(e) for e in self.car_secondaire)
             return self.nom + ': ' + str(self.niveau) + '\n' + s
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  19. #19
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut une solution mitigéee
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    from dataclasses import dataclass
     
     
    @dataclass
    class caracteristique_secondaire(object):
    	nom : str
    	description : str
    	niveau : int 
     
    class caracteristique_primaire(object):
    	def __init__(self, nom , description , niveau):
    		self.nom  = nom
    		self.description= description
    		self.niveau  =niveau
    		self.car_secondaire  = []
     
    	def __str__(self):
    		retour = self.nom + ': ' + str(self.niveau) + '\n\t'
    		for car in self.car_secondaire:
    			retour += car. __str__()+ '\n\t'
    			return retour
     
    	def ajouter_car_secondaire(self,car_sec):
    		self.car_secondaire.append(car_sec )
     
     
    if __name__ == '__main__':
    	car_deplacement = caracteristique_secondaire('Déplacement',None,2)
    	car_deplacement.description = 'Capacité du personnage à se déplacer vite et gracieusement.'
    	car_force =  caracteristique_secondaire('Force',None,1)
    	car_force.description  = 'Puissance brute du personnage et ce qu’il est capable de soulever.'
    	car_endurance = caracteristique_secondaire('Endurance',None,3)
    	car_endurance.description = 'Résistance du personnage à la fatigue, aux maladies, poisons, climats.'
    	car_chair = caracteristique_primaire('Chair',None , 7 )
    	car_chair.description = 'Cet aspect représente la vigueur, la puissance du corps et sa beauté.'
     
    	car_chair.ajouter_car_secondaire(car_force)
    	car_chair.ajouter_car_secondaire(car_deplacement)
    	car_chair.ajouter_car_secondaire(car_endurance)
     
    	print(car_chair)
    le resultat est etrange

    Chair: 7
    caracteristique_secondaire(nom='Force', description='Puissance brute du personnage et ce qu’il est capable de soulever.', niveau=1)

    Alors que la class caracteristique_primaire s'appuie sur les données de la dataclass caracteristique_secondaire c'est curieux



    la modification de la class caracteristique_primaire(object) merci wiztricks.
    j'ai ajouter un effet de tabulation a ta solution.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		def __str__(self):
             s = '\n\t'.join(str(e) for e in self.car_secondaire)
             return self.nom + ': ' + str(self.niveau) + '\n\t' + s
    permet de résoudre le problème


    Résultat
    Chair: 7
    caracteristique_secondaire(nom='Force', description='Puissance brute du personnage et ce qu’il est capable de soulever.', niveau=1)
    caracteristique_secondaire(nom='Déplacement', description='Capacité du personnage à se déplacer vite et gracieusement.', niveau=2)
    caracteristique_secondaire(nom='Endurance', description='Résistance du personnage à la fatigue, aux maladies, poisons, climats.', niveau=3)


    Il me reste un problème à implémenter.

    La valeur des caractéristiques secondaires ne peut pas être supérieur à la caractéristique primaire.
    Toute valuation de celle-ci doit donc être conditionnée.
    Chair --> caractéristique primaire
    Déplacement --> caractéristique dépendante de Chair
    Force --> caractéristique dépendante de Chair
    Endurance --> caractéristique dépendante de Chair

    Hors mon code en l'état fait la saisie des caracteristique_secondaire avant de créer la caractéristique primaire.

  20. #20
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Une idee qui ne fonctione pas
    Voici un test de solution
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    # coding: utf-8 
    from dataclasses import dataclass
     
     
    @dataclass
    class caracteristique_secondaire(object):
    	nom : str
    	description : str
    	niveau : int 
     
    class caracteristique_primaire(object):
    	def __init__(self, nom , description , niveau):
    		self.nom  = nom
    		self.description= description
    		self.niveau  =niveau
    		self.car_secondaire  = []
     
    	def __str__(self):
    		s = '\n\t'.join(str(e) for e in self.car_secondaire)
    		return self.nom + ': ' + str(self.niveau) + '\n\t' + s		
     
     
    	def ajouter_car_secondaire(self,car_sec):
    		self.car_secondaire.append(car_sec )
     
    """
    Chair : Cet aspect représente la vigueur, la puissance du corps et sa beauté.
            Déplacement : Capacité du personnage à se déplacer vite et gracieusement.
            Force : Puissance brute du personnage et ce qu’il est capable de soulever.
            Endurance : Résistance du personnage à la fatigue, aux maladies, poisons, climats.
    """	
    class C_Chair(object):
    	def __init__(self, niveau_chair ,niveau_deplacement,niveau_force,niveau_endurance):
     
    		# définiton primaire
    		self.car_chair = caracteristique_primaire('Chair',None , self.niveau_chair )
    		self.car_chair.description = 'Cet aspect représente la vigueur, la puissance du corps et sa beauté.'
    		# définiton secondaire 
    		car_deplacement = caracteristique_secondaire('Déplacement',None,niveau_deplacement)
    		car_deplacement.description = 'Capacité du personnage à se déplacer vite et gracieusement.'
     
    		car_force =  caracteristique_secondaire('Force',None,niveau_force)
    		car_force.description  = 'Puissance brute du personnage et ce qu’il est capable de soulever.'
     
    		car_endurance = caracteristique_secondaire('Endurance',None,niveau_endurance)
    		car_endurance.description = 'Résistance du personnage à la fatigue, aux maladies, poisons, climats.'
     
    		if(niveau_chair <= niveau_deplacement) :
    			print('Probleme le déplacement (' + str(niveau_deplacement)+') ne peut être  suppérieur à la caractéristique chair ('+ str(niveau_chair)+ ')')
    			exit(1)
     
     
    		if(niveau_chair <= niveau_force) :
    			print('Probleme la force (' + str(niveau_force)+') ne peut être  suppérieur à la caractéristique chair ('+ str(niveau_chair)+ ')')
    			exit(1)
     
    		if(niveau_chair <= niveau_endurance) :
    			print('Probleme l'/' endurancee (' + str(niveau_endurance)+') ne peut être  suppérieur à la caractéristique chair ('+ str(niveau_chair)+ ')')
    			exit(1)
     
     
    		self.car_chair.ajouter_car_secondaire(car_force)
    		self.car_chair.ajouter_car_secondaire(car_deplacement)
    		self.car_chair.ajouter_car_secondaire(car_endurance)
     
    if __name__ == '__main__':
     
    	car_chair =C_Chair(3,2,3,3)
     
    	print(car_chair)

    Problème
    Traceback (most recent call last):
      File " caracteristique2.py", line 106, in <module>
        car_chair =C_Chair(3,2,3,3)
      File " caracteristique2.py", line 74, in __init__
        self.car_chair = caracteristique_primaire('Chair',None , self.niveau_chair )
    AttributeError: 'C_Chair' object has no attribute 'niveau_chair'

Discussions similaires

  1. Réponses: 40
    Dernier message: 21/06/2007, 17h58
  2. Réponses: 14
    Dernier message: 28/02/2007, 09h53
  3. Réponses: 1
    Dernier message: 09/02/2007, 12h28
  4. Créer une classe commune à +sieurs fiches
    Par rtg57 dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/05/2006, 17h58
  5. Réponses: 4
    Dernier message: 08/10/2005, 09h31

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