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 :

un object dans un tableau [Python 3.X]


Sujet :

Python

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Par défaut un object dans un tableau
    Bonjour, sur un code en Python et depuis peu sur ce langage, j'ai un problème (lol)
    Je charge un xml contenant des périphérique a contrôler et leurs variables
    J'utilise ensuite ces données pour placer dans un tableau une référence a chaque périphérique et l'objet class qui le control
    Ensuite j'ai des fonctions parcourent pur inter agir avec les périphériques

    Le problème c'est que l’objet extrais de ce tableau ne semble pas être utilisable

    extrait du code :
    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
     
    import telemetreSonClasse
    import laserClasse
    import optiquePicamClasse
    from lxml import etree
    import reperes3D
     
     
    class gestion(object):
     
        def __init__(self, fichierPerif="perifs.xml", dossierData="data"):
     
            self._fichierPerif = fichierPerif
            self._dossierData = dossierData
            self._tblPerifs = list()
     
            perifs = etree.parse(self._dossierData + "/" + self._fichierPerif)
            for perif in perifs.xpath("/perifs/perif"):
                types = str(perif.find('type').text)
                nom = str(perif.find('nom').text)
                if types == "laser":
                    objl = laserClasse.laser(nom, self._fichierPerif, self._dossierData)
                    self._tblPerifs.append([nom, types, objl])
                if types == "ultraSon":
                    obju = telemetreSonClasse.telemetre(nom, self._fichierPerif, self._dossierData)
                    self._tblPerifs.append([nom, types, obju])
                if types == "cam":
                    objc = optiquePicamClasse.optique(nom, self._fichierPerif, self._dossierData)
                    self._tblPerifs.append([nom, types, objc])
    utilisation problématique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        def photo(self, sauve, nomScan, tblMatricePos):
            for ligne in self._tblPerifs:
                if ligne[1] == "cam" and ligne[0] == "1":
                    obj = ligne[2]
                    obj.scanneNom(nomScan)
                    obj.tblPosScan(self, sauve, nomScan, tblMatricePos)
                    img = obj.photo(sauve)
                    break
            return img

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Il faudrait montrer un exemple de ces classes.

    Qaund on lit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        objc = optiquePicamClasse.optique(...)
    on est tenté de croire que optique est une méthode de la classe optiquePicamClasse et donc effectivement ça échouera dans ta fonction optique().

    Éventuellement, rajoute un print(objc) pour voir ce qu'il en est.

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Par défaut
    optique instencie la classe optiquePicamClasse
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
     
    from lxml import etree
    from io import BytesIO
    from picamera import PiCamera
    from PIL import Image
     
     
    class optique(object):
     
        def __init__(self, nom="", fichierPerif="perifs.xml", dossierData="data"):
            self._nom = nom
            self._type = "cam"
            self._fichierPerif = fichierPerif
            self._dossierData = dossierData
            self._camera = PiCamera()
            self._scanneDoc = "scans"
            self._fichierFormat = "jpg"
            self._scanneNom = ""
            # position par raport au referanciel du bloque de liason
            self._x = 0
            self._y = 0
            self._z = 0
            self._rx = 0
            self._ry = 0
            self._rz = 0
     
            self._angleFocalLarge = 0
            self._angleFocalHaut = 0
            self._resolutionl = 0
            self._resolutionh = 0
            self._dimPixl = 0
     
            self._lien = ""
     
            self._testInit = True
     
            self._tblPosScan = list()
     
        def intiBase(self):
            perifs = etree.parse(self._dossierData + "/" + self._fichierPerif)
            for perif in perifs.xpath("/perifs/perif"):
                if perif.find('type').text == self._type:
                    if perif.find('nom').text == self._nom:
                        self._x = float(perif.find('x').text)
                        self._y = float(perif.find('y').text)
                        self._z = float(perif.find('z').text)
                        self._Rx = float(perif.find('Rx').text)
                        self._Ry = float(perif.find('Ry').text)
                        self._Rz = float(perif.find('Rz').text)
     
                        self._angleFocalLarge = float(perif.find('angleFocalLarge').text)
                        self._angleFocalHaut = float(perif.find('angleFocalHaut').text)
                        self._resolutionl = float(perif.find('resolutionl').text)
                        self._resolutionh = float(perif.find('resolutionh').text)
                        self._dimPixl = float(perif.find('dimPixl').text)
     
                        self._lien = str(perif.find('lien').text)
     
                        self._camera.hflip = bool(perif.find('hflip').text)
                        self._camera.vfli = bool(perif.find('vflip').text)
                        self._camera.sharpness = int(perif.find('sharpness').text)
                        self._camera.contrast = int(perif.find('contrast').text)
                        self._camera.brightness = int(perif.find('brightness').text)
                        self._camera.saturation = int(perif.find('saturation').text)
                        self._camera.ISO = int(perif.find('ISO').text)
                        self._camera.video_stabilization = bool(perif.find('vnomeo_stabilization').text)
                        self._camera.exposure_compensation = int(perif.find('exposure_compensation').text)
                        self._camera.exposure_mode = str(perif.find('exposure_mode').text)
                        self._camera.meter_mode = str(perif.find('meter_mode').text)
                        self._camera.awb_mode = str(perif.find('awb_mode').text)
                        self._camera.image_effect = str(perif.find('image_effect').text)
                        self._camera.color_effects = str(perif.find('color_effects').text)
                        self._camera.rotation = int(perif.find('rotation').text)
                        self._camera.crop = (
                        float(perif.find('cropA').text), float(perif.find('cropB').text), float(perif.find('cropC').text),
                        float(perif.find('cropD').text))
                        self._camera.resolution = (self._resolutionl, self._resolutionh)
     
            self._testInit = False
     
        def nomage(self):
            if self._scanneNom == "": self._scanneNom = "test"
            self._DossierDuScan = self._scanneNom
            self._DossierDesScan = self._scanneDoc
     
            self._nomDeLaPhoto = self._scanneNom + "_"
            self._nomDeLaPhoto += self._tblPosScan[0] + "_"
            self._nomDeLaPhoto += self._tblPosScan[1] + "_"
            self._nomDeLaPhoto += self._tblPosScan[2] + "_"
            self._nomDeLaPhoto += self._tblPosScan[3] + "_"
            self._nomDeLaPhoto += self._tblPosScan[4] + "_"
            self._nomDeLaPhoto += self._tblPosScan[5]
            self._nomDeLaPhoto += "." + self._fichierFormat
     
            self._NomCompletEnregistrement = self._DossierDesScan + "/"
            self._NomCompletEnregistrement += self._DossierDuScan + "/"
            self._NomCompletEnregistrement += self._nomDeLaPhoto
            return self._NomCompletEnregistrement
     
        def photo(self, sauve=False):
            if sauve:
                img = self.photoFichier()
            else:
                img = self.photoStream()
            return img
     
        def photoStream(self):
            if self._testInit: self.intiBase()
            stream = BytesIO()
            self._camera.capture(stream, format='jpeg')
            img = Image.open(stream)
            stream.close()
            return img
     
        def photoFichier(self):
            if self._testInit: self.intiBase()
            nom = self.nomage(self)
            self._camera.capture(nom)
            img = Image.open(nom)
            return img
     
        @property
        def angleFocalLarge(self):
            return self._angleFocalLarge
     
        @angleFocalLarge.setter
        def angleFocalLarge(self, v):
            self._angleFocalLarge = v
     
        @property
        def angleFocalHaut(self):
            return self._angleFocalHaut
     
        @angleFocalHaut.setter
        def angleFocalHaut(self, v):
            self._angleFocalHaut = v
     
        @property
        def resolutionl(self):
            return self._resolutionl
     
        @resolutionl.setter
        def resolutionl(self, v):
            self._resolutionl = v
     
        @property
        def resolutionh(self):
            return self._resolutionh
     
        @resolutionh.setter
        def resolutionh(self, v):
            self._resolutionh = v
     
        @property
        def dimPixl(self):
            return self._dimPixl
     
        @dimPixl.setter
        def dimPixl(self, v):
            self._dimPixl = v
     
        @property
        def lien(self):
            return self._lien
     
        @lien.setter
        def lien(self, v):
            self._lien = v
     
        @property
        def position(self):
            return self._x, self._y, self._z, self._rx, self._ry, self._rz
     
        @position.setter
        def position(self, x, y, z, rx, ry, rz):
            self._x = x
            self._y = y
            self._z = z
            self._rx = rx
            self._ry = ry
            self._rz = rz
            _position = ([x, y, z, rx, ry, rz])
     
        @property
        def tblPosScan(self):
            return self._tblPosScan
     
        @tblPosScan.setter
        def tblPosScan(self, tbl):
            self._tblPosScan = tbl
     
        @property
        def fichierFormat(self):
            return self._fichierFormat
     
        @fichierFormat.setter
        def fichierFormat(self, v):
            self._fichierFormat = v
     
        @property
        def scanneDoc(self):
            return self._scanneDoc
     
        @scanneDoc.setter
        def scanneDoc(self, v):
            self._scanneDoc = v
     
        @property
        def scanneNom(self):
            return self._scanneNom
     
        @scanneNom.setter
        def scanneNom(self, v):
            self._scanneNom = v

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Salut,

    Citation Envoyé par jgarin Voir le message
    utilisation problématique :
    Ce qui est problématique est que vous être trop débutant pour savoir qu'il est important d'interpréter le message d'erreur et le donner.
    D'autant qu'on ne peut pas reproduire simplement le "problème".

    Après on peut lire le code et si le type des attributs scanneNom et tblPosScan est cohérent avec leur type initial (resp. str et list) tout ce qu'on peut dire c'est que ce ne sont pas des fonctions...
    Et que vous ne pouvez pas faire comme si çà en était (Python devrait râler dans ce sens).

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

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Par défaut
    merci, bien que débutant sur Python, il est évident que c'est pas une fonction, puisque le but est de récupérer l’instanciation d'un objet pour pouvoir accéder a ces attributs et méthodes, et l'idée de le placer dans un tableau est de pouvoir gérer le fonctionnement quel que soit leur quantité et types

    Pour le message d'erreur, je vous en ais fait l’interprétation, je suis pas convaincus que l’intitulé exact change le concept
    mais le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TypeError: 'tuple' object is not callable
    perifsClasse.py, line 45
    En gros, je cherche a faire un pointeur vers un objet déjà instancié ou quel que soit la façon de le nommer pour le stocker dans une list

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Citation Envoyé par jgarin Voir le message
    En gros, je cherche a faire un pointeur vers un objet déjà instancié ou quel que soit la façon de le nommer pour le stocker dans une list
    Le message d'erreur vous dit juste qu'un tuple n'est pas une fonction....

    Citation Envoyé par jgarin Voir le message
    il est évident que c'est pas une fonction, puisque le but est de récupérer l’instanciation d'un objet pour pouvoir accéder a ces attributs et méthodes
    Pour faire çà, la ligne
    obj = ligne[2]
    devrait suffire.
    Vous pouvez vérifier que ce qui a été récupéré est "correct" via print(type(obj)) et çà devrait correspondre à ce qui a été mis dans le tableau.

    Le soucis est, à priori, après i.e. à la méthode appliquée à l'attribut auquel vous accédez. Si vous devriez pouvoir écrire: print(obj.scanneNom)...
    obj.scanneNom n'étant pas un "callable", impossible pour Python de laisser passer obj.scanneNom(nomScan)

    note: si vous ne pouviez pas accéder à l'attribut scanneNom de "obj", le message d'erreur aurait été différent.

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

  7. #7
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Par défaut
    Merci a vous, le problème venais du fait que j'avais instancié la classe mais que je n'avais pas initialisé les variables, il ne pouvais donc pas me renvoyer des infos.

    Merci @wiztricks, bourru dans la première réponse ;-p , mais tu m'a confirmé la validité de la partie qui m’inquiétait, pas mal de langages et a chaque fois que j'en commence un, les question tournent autours du fait de savoirs si j'ai bien compris l'usage et les subtilités, je continus mon debug, ( exemple d'erreur classique ici, un ; en fin de ligne mis par reflex ;p )

    Passer sur C++ et python qui ont des règles opposées reste complexe ;-)

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Citation Envoyé par jgarin Voir le message
    Passer sur C++ et python qui ont des règles opposées reste complexe ;-)
    Python est juste un meilleur C++ (et il accepte ";" comme séparateur d'instructions ou en fin de ligne).

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

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    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 828
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par jgarin Voir le message
    Passer sur C++ et python qui ont des règles opposées reste complexe ;-)
    Certainement pas. Passer de Python à C++ ok c'est complexe (parfois je m'amuse sur un site de challenge mélangeant prog et jeu à recoder mes trucs Python en C ou C++ et j'en chie grave), mais passer de C++ (où tu dois tout prototyper, déclarer, définir) à Python (où tu lui dis simplement "bouffe ça, que ce soit string ou tuple ou list de toute façon c'est itérable donc tu peux te démerder à le traiter") ça simplifie vachement le travail !!!
    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]

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

Discussions similaires

  1. [BO Info] BUSINESS OBJECT : pbm de sous-totaux dans un tableau mutli-requêtes avec saut
    Par SCHENAL dans le forum SAP Business Objects
    Réponses: 0
    Dernier message: 19/07/2018, 11h15
  2. [Plugin] Plusieurs object dans un tableau
    Par nlefebvre1 dans le forum jQuery
    Réponses: 0
    Dernier message: 16/12/2014, 21h17
  3. Réponses: 2
    Dernier message: 28/02/2012, 09h38
  4. Appel un object dans Tableau d'objects
    Par aristeas dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 22/11/2008, 22h07
  5. Réponses: 3
    Dernier message: 13/07/2006, 15h48

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