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 :

Problème d'héritage de classe


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Par défaut Problème d'héritage de classe
    Bonjours,

    J'ai un petit problème au niveau de la compréhension de l'héritage en python. je souhaite hériter d'une classe pour modifier une méthode à l'intérieur, et ajouter un paramètre à passer à cette classe.

    Je veux modifier la classe smtplib pour permettre un bind sur une adresse spécifique l'or d'un envoie d'email.

    Voici un exemple en quelque lignes:

    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 smtplib
    import socket
    import re
    import email.utils
    import base64
    import hmac
    from email.base64mime import encode as encode_base64
    from sys import stderr
     
     
    class SMTP2(smtplib.SMTP):
     
        def __init__(self, host='', port=0, local_hostname=None,timeout=socket._GLOBAL_DEFAULT_TIMEOUT, bind_ip=None):
     
            def _get_socket(self, port, host, timeout, bind_ip=None):
                # This makes it simpler for SMTP_SSL to use the SMTP connect code
                # and just alter the socket connection bit.
                if self.debuglevel > 0: print>>stderr, 'connect:', (host, port)
                return socket.create_connection((port, host), timeout, (bind_ip, ''))
     
     
     
    s = SMTP2('smtp.google.com', bind_ip='192.168.0.2')
    s.sendmail('test@test.com', 'test@test.com', 'Ceci est un test')
    Au moment de tester mon code j'obtiens cette erreur:

    root@squeeze:~# python test.py
    Traceback (most recent call last):
    File "test.py", line 24, in <module>
    s.sendmail('test@test.com', 'test@test.com', 'This is a test')
    File "/usr/lib/python2.6/smtplib.py", line 685, in sendmail
    self.ehlo_or_helo_if_needed()
    File "/usr/lib/python2.6/smtplib.py", line 509, in ehlo_or_helo_if_needed
    if not (200 <= self.ehlo()[0] <= 299):
    File "/usr/lib/python2.6/smtplib.py", line 382, in ehlo
    self.putcmd(self.ehlo_msg, name or self.local_hostname)
    AttributeError: SMTP2 instance has no attribute 'local_hostname'
    Je pense que c'est un soucis au niveau de l'héritage de la classe SMTP / ou du constructeur.

    Merci de votre aide,

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonsoir,

    tu dois appeler de manière explicite le init de la classe de base tout en lui passant les arguments qu'il attend:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class SMTP2(smtplib.SMTP):
     
        def __init__(self, host='', port=0, local_hostname=None,timeout=socket._GLOBAL_DEFAULT_TIMEOUT, bind_ip=None):
            smtplib.__init__(self, host, port, local_hostname, timeout)
            self._bindip = bind_ip
        def _get_socket(self, port, host, timeout, bind_ip=None):
                # This makes it simpler for SMTP_SSL to use the SMTP connect code
                # and just alter the socket connection bit.
                if self.debuglevel > 0: print>>stderr, 'connect:', (host, port)
                return socket.create_connection((port, host), timeout, (bind_ip, ''))

  3. #3
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    D’accord avec kango, mais je crois qu’il a oublié quelque chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class SMTP2(smtplib.SMTP):
     
        def __init__(self, host='', port=0, local_hostname=None,timeout=socket._GLOBAL_DEFAULT_TIMEOUT, bind_ip=None):
            smtplib.SMTP.__init__(self, host, port, local_hostname, timeout)
            self._bindip = bind_ip
        def _get_socket(self, port, host, timeout, bind_ip=None):
                # This makes it simpler for SMTP_SSL to use the SMTP connect code
                # and just alter the socket connection bit.
                if self.debuglevel > 0: print>>stderr, 'connect:', (host, port)
                return socket.create_connection((port, host), timeout, (bind_ip, ''))

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    tout à fait !

    j'avais pas les yeux en face des trous...

  5. #5
    Nouveau candidat au Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Par défaut
    Parfait, merci pour les explications, je ne savais pas qu'il fallait rappeler le 'constructeur' de la classe héritée.

Discussions similaires

  1. Problème d'héritage de plusieures classes
    Par loursalacampagne dans le forum Langage
    Réponses: 7
    Dernier message: 07/07/2008, 12h02
  2. Problème d'héritage avec une classe abstraite
    Par Ph.denis dans le forum C++
    Réponses: 7
    Dernier message: 22/03/2008, 10h37
  3. Problème d'héritage css (classe et objet)
    Par Askle dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 03/06/2007, 20h11
  4. Problème héritage et classes abstraites
    Par sebzinzin dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2007, 18h24
  5. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 16h00

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