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 :

[Python 2.X] Affichage class - methode


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut [Python 2.X] Affichage class - methode
    Bonjour,

    Auriez-vous svp une explication pour les class.
    l'affichage de l'ensemble des éléments sembles ne pas correspondre à l'ordre de déclaration dans le fichier source.

    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
     
    class Trame:
        # Trame ethernet de 14 octets
        def __init__(self):
            self.Eth_macsrc    = '\x00\x00\x00\x00\x00\x00'
            self.Eth_macdst    = '\x00\x00\x00\x00\x00\x00'
            self.Eth_type      = '\x08\x06'
        # Trame ARP de 28 octets
            self.Arp_hardtype  = '\x00\x01'
            self.Arp_protocol  = '\x08\x00'
            self.Arp_taillemac = '\x06'
            self.Arp_tailleip  = '\x04'
            self.Arp_op        = '\x00\x00'
            self.Arp_macsrc    = '\x00\x00\x00\x00\x00\x00'
            self.Arp_ipsrc     = '\x00\x00\x00\x00'
            self.Arp_macdst    = '\x00\x00\x00\x00\x00\x00'
            self.Arp_ipdst     = '\x00\x00\x00\x00'
    Pour avoir les éléments de ma classe et leurs valeurs j'utilse __dict__keys() et __dict__values()

    rendu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ['Arp_taillemac', 'Arp_tailleip', 'Arp_macsrc', 'Arp_protocol', 'Eth_macsrc', 'Arp_hardtype', 'Arp_op', 'Eth_type', 'Eth_macdst', 'Arp_ipsrc', 'Arp_macdst', 'Arp_ipdst']
    ['06', '04', 'xxxxxxxx', '0800', 'xxxxxxxx', '0001', '0001', '0806', 'ffffffffffff', 'xxx.xxx.x.xx, '000000000000', 'xxx.xxx.xx.xxx']
    ('\x00\x01', '\x08\x00', '\x06', '\x04', '\x00\x01', "\xxxxxxxxxxxxf", '\xxxxxxxxx\x11', '\x00\x00\x00\x00\x00\x00', 'xxxxxxxxxxe')

    Est-il possible de demander le __dict__.keys() dans l'ordre de la source.py ?

    Cordialement,
    sun

  2. #2
    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 sunriseparadyse Voir le message
    Est-il possible de demander le __dict__.keys() dans l'ordre de la source.py ?
    Techniquement, c'est possible en faisant en sorte que le __dict__ de l'instance soit un OrderedDict. Ce qui suppose la maîtrise des metaclass ou le "blind-copy" de codes sur Internet. Une autre solution est d'attendre la version 3.6 qui vient avec des améliorations des "dict" dont l'effet de bord est d'en faire des OrderedDict.

    Dans la pratique, vous créez une liste de noms des attributs (une liste préserve l'ordre) et vous faites une boucle "for e in liste: instance.__dict__.get(e)...."

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

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    Dans votre cas il conviendrait sans doutes mieux d'utiliser une structure identique aux structures en C.

    C'est beaucoup plus simple à manipuler et beaucoup plus efficace et rapide aussi quand on souhaite extraire ou assembler les champs de la structure sur un paquet/trame.

    Une structure va permettre de définir le lien entre chaque élément, son type (pour l'interprétation du champ), sa position et sa longueur dans un paquet/groupe. Ce qui évite ensuite de devoir assembler le tout par manipulation bytes.

    Un exemple que j'avais posté sur Sam & Max :

    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
    import ctypes
     
    class Header_Decoder(ctypes.BigEndianStructure): # {
        _pack_ = 1
        _fields_ = [
            ('protocol_id', ctypes.c_uint8, 8),      # 1 byte:  byte 1,      bits 00-07
            ('segmentation', ctypes.c_uint8, 3),     # 3 bits:  byte 2,      bits 08-10
            ('transaction_type', ctypes.c_uint8, 5), # 5 bits:  byte 2,      bits 11-15
            ('packet_length', ctypes.c_uint32),      # 4 bytes: bytes 3-6,   bits 16-47
            ('checksum', ctypes.c_uint16),           # 2 bytes: bytes 7-8,   bits 48-63
        ]
    # } Header_Decoder
     
    HEADER_LENGHT_BYTES = ctypes.sizeof(Header_Decoder)
     
    packet = b'\xFF\x10\x00\x00\x00\x0C\x00\xE3\x48\x65\x79\x21'
     
    header = Header_Decoder.from_buffer_copy(packet[0 : 0 + HEADER_LENGHT_BYTES])
     
    print("Protocol ID:", header.protocol_id)
    print("Segmentation:", header.segmentation)
    print("Transaction type:", header.transaction_type)
    print("Checksum:", header.checksum)
    print("Data:", packet[HEADER_LENGHT_BYTES : header.packet_length].decode('ascii'))
    Et à l'inverse pour composer une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    header = Header_Decoder()
     
    bytes(header)
    b'\x00\x00\x00\x00\x00\x00\x00\x00'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    header.protocol_id = 2
     
    bytes(header)
    b'\x02\x00\x00\x00\x00\x00\x00\x00'


    [('protocol_id', <class 'ctypes.c_ubyte'>, 8), ('segmentation', <class 'ctypes.c_ubyte'>, 3), ('transaction_type', <class 'ctypes.c_ubyte'>, 5), ('packet_length', <class 'ctypes.c_ulong'>), ('checksum', <class 'ctypes.c_ushort'>)]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for field in header._fields_:
    	print(field[0], field[1].__name__, getattr(header, field[0]), sep=": ")
    protocol_id: c_ubyte: 2
    segmentation: c_ubyte: 0
    transaction_type: c_ubyte: 0
    packet_length: c_ulong_be: 0
    checksum: c_ushort_be: 0


    NB: Attention à la fonction bytes(), c'est utile pour convertir une structure/sous-structure en octets mais il ne faut surtout pas l'utiliser pour convertir un champ en octets/bytes car si c'est un nombre il va utiliser sa valeur pour définir le nombre d'octets à renvoyer et non le convertir !
    bytes(int) -> bytes object of size given by the parameter initialized with null bytes
    bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/02/2007, 15h13
  2. [Langage][Classe][Methode]Comment récuperer les arguments d'une fonction ?
    Par FremyCompany dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/07/2006, 16h06
  3. [Python] Chargement et affichage d'une image
    Par Corpio dans le forum OpenGL
    Réponses: 10
    Dernier message: 13/04/2006, 17h35
  4. Super classes et sous-classes/Méthodes
    Par smag dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2005, 23h10
  5. [Exception]Connaitre la pile d'appel de classes/méthodes
    Par salome dans le forum Général Java
    Réponses: 2
    Dernier message: 19/03/2005, 20h21

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