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 :

self, équivalant a this de java en python ? et constructeur avec paramètre


Sujet :

Python

  1. #1
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Par défaut self, équivalant a this de java en python ? et constructeur avec paramètre
    Bonjour,

    Je ptogramme en python de la même manière qu'en java (language dans lequel j'ai été formé). Hélas, si j'essaie d'utiliser self.méthode() ça marche bien par contre quand il faut l'utiliser comme référence simple dans un constructeur ça ne marche pas

    Exemple :

    Utilisation normal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        self.now = datetime.datetime.now()
    et le code qui ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        timer = Timer(self.diff.seconds,0,self)
    Pourquoi ?

    J'ai également essayer de programmer une classe avec un constructeur qui prend des paramètre mais là python me dit que le constructeur object() duquel hérite la classe ne prend pas de paramètre.

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _init (self,seconde) :
    # pas d'appel de super()
          Self.seconde = seconde
    Que ce passse-t-il ?

    Merci pour votre aide

    Salutations

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    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 049
    Par défaut
    Un exemple de classe avec constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A:
        def __init__(self, seconde):
            self.seconde = seconde
        def increment(self):
            n = 1
            self.seconde += n
        # blabla
    Par contre, pour le reste, on a du mal à te suivre, beaucoup d'incohérence, car ton code est incomplet pour comprendre ce que tu souhaites faire.

  3. #3
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 305
    Par défaut
    Citation Envoyé par Battant Voir le message
    Bonjour,

    Je ptogramme en python de la même manière qu'en java (language dans lequel j'ai été formé). Hélas, si j'essaie d'utiliser self.méthode() ça marche bien par contre quand il faut l'utiliser comme référence simple dans un constructeur ça ne marche pas
    ...
    et le code qui ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        timer = Timer(self.diff.seconds,0,self)
    Pourquoi ne marche-t-il pas ? message d'erreur ?

    J'ai également essayer de programmer une classe avec un constructeur qui prend des paramètre mais là python me dit que le constructeur object() duquel hérite la classe ne prend pas de paramètre.

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _init (self,seconde) :
    # pas d'appel de super()
          Self.seconde = seconde
    Tout d'abord __init__() n'est pas le constructeur, c'est à __new__() que revient cette tâche. Rarement nécessaire et rarement rencontré par ailleurs.

    Il est aussi important de respecter la syntaxe de __init__(), dans ton exemple _init (self,seconde) : ne remplira pas la fonction attendue de __init__(). Pareil pour self qui devient Self à la ligne suivante

    Je suppose donc que ta classe est comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Foo():
    # ou bien:
    class Foo(object):
    et donc si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    foo = Foo(seconde)
    le message d'erreur me paraît normal.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    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 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Battant Voir le message
    et le code qui ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        timer = Timer(self.diff.seconds,0,self)
    Pourquoi ?
    Salut
    Cette instruction implique que le membre "diff" de ton instance "self" est lui-même un objet qui contient un membre "seconds". Si c'est pas le cas alors erreur.

    Citation Envoyé par Battant Voir le message
    J'ai également essayer de programmer une classe avec un constructeur qui prend des paramètre mais là python me dit que le constructeur object() duquel hérite la classe ne prend pas de paramètre.

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _init (self,seconde) :
    # pas d'appel de super()
          Self.seconde = seconde
    Que ce passse-t-il ?
    Ben il se passssssse rien dans la mesure où "_init()" n'est pas équivalent à "__init__()"...
    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 très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Par défaut Le code
    Bonjour,

    Voici le 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
    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
     
    import datetime
    from threading import *
     
    class Server(object):
        """
        Serveur de gestion automatique de facturation  lié à un agenda
        """
     
     
        def __init__(self) :
            print ("Server constructor")
     
                    # code from datetime python documentation http://docs.python.org/2/library/datetime.html
            # Using datetime.combine()
            # setting up alarm
            self.d =  datetime.date(2013, 8, 14)
            self.t = datetime.time(12, 0)
            self.alarme = datetime.datetime.combine(self.d, self.t)
            print (" L'alarme est réglée à ",self.alarme)
     
     
     
     
            #self.currenttime()
            # get the current time
            self.now = datetime.datetime.now()
     
            # code from http://domeu.blogspot.fr/2011/04/time-datetime-manipulation-du-temps-en.html
     
            # Conversion de la date en datetime
            #self.now_datetime =  datetime.datetime(self.now.year, self.now.month, self.now.day,.time. )
            print("Maintenant nous some le : ",self.now.strftime('%d/%m/%y %H:%M'))
     
            # code from http://domeu.blogspot.fr/2011/04/time-datetime-manipulation-du-temps-en.html
     
            # Evalutation de la difference
            self.diff = self.alarme - self.now
     
            print ("La différence totale : ",self.diff)
            print( "Différence en secondes = %i" % (self.diff.seconds) )
            print( "Différence en minutes = %i" % (self.diff.seconds // 60) )
            print( "Différence en heures = %i" % (self.diff.seconds // 3600) )
     
            print( "Différence en jours = %i" % (self.diff.days) )
     
        # Settings timer
     
        timer = Timer(self.diff.seconds,0,self)
        t.start()
        print chr(7)
        print chr(7)
     
    # Teste
     
    if __name__ == '__main__':
        server = Server()
        print("terminer")
    La ligne qui ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        timer = Timer(self.diff.seconds,0,self)
    L'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     File "Server.py", line 16, in <module>
        class Server(object):
      File "Server.py", line 60, in Server
        timer = Timer(self.diff.seconds,0,self)
    NameError: name 'self' is not defined
    Qu'en pensez-vous ?

    Merci pour votre aide

    Salutations

  6. #6
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 305
    Par défaut
    Ton niveau d'indentation est inexact, self n'existe que lorsqu'il est définit comme référence de l'instance de la classe et cela se passe dans ton code au niveau de __init__()

    Pour t'en rendre compte ajoute une ligne print ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Server(object):
        """
        Serveur de gestion automatique de facturation  lié à un agenda
        """
        def __init__(self) :
            print ("Server constructor")
            # ...
     
        print ("Before __init__()")
        timer = Timer(self.diff.seconds,0,self)
        # ...
    tu verras que Before __init__() sera printé avant l'erreur et surtout avant Server constructor

    Autre erreur potentielle, les arguments de threading.Timer() sont: Interval temps, Fonction à appeller, arguments positionnels, Arguments mots clés. Dans ton exemple, Timer(self.diff.seconds,0,self) les arguments 2 et 3 ne me semblent pas exacts.
    Pourquoi mets-tu ce timer à cet endroit, quel est sa fonction ?

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    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 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Battant Voir le message
    Bonjour,

    Voici le code :

    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
    55
    import datetime
    from threading import *
    
    class Server(object):
        """
        Serveur de gestion automatique de facturation  lié à un agenda
        """
       
        def __init__(self) :
            print ("Server constructor")
            
            # code from datetime python documentation http://docs.python.org/2/library/datetime.html
            # Using datetime.combine()
            # setting up alarm
            self.d =  datetime.date(2013, 8, 14)
            self.t = datetime.time(12, 0)
            self.alarme = datetime.datetime.combine(self.d, self.t)
            print (" L'alarme est réglée à ",self.alarme)
    
    
    
            
            #self.currenttime()
            # get the current time
            self.now = datetime.datetime.now()
          
            # code from http://domeu.blogspot.fr/2011/04/time-datetime-manipulation-du-temps-en.html
            
            # Conversion de la date en datetime
            #self.now_datetime =  datetime.datetime(self.now.year, self.now.month, self.now.day,.time. )
            print("Maintenant nous some le : ",self.now.strftime('%d/%m/%y %H:%M'))
            
            # code from http://domeu.blogspot.fr/2011/04/time-datetime-manipulation-du-temps-en.html
            
            # Evalutation de la difference
            self.diff = self.alarme - self.now
            
            print ("La différence totale : ",self.diff)
            print( "Différence en secondes = %i" % (self.diff.seconds) )
            print( "Différence en minutes = %i" % (self.diff.seconds // 60) )
            print( "Différence en heures = %i" % (self.diff.seconds // 3600) )
            
            print( "Différence en jours = %i" % (self.diff.days) )
    
        # __init__()
    
        # Ici tu te trouves hors de toute méthode ; donc dans la zone associée à la classe elle-même (qu'on peut appeler "statique") et donc hors de toute instance. self n'existe donc pas.
        
        timer = Timer(self.diff.seconds,0,self)
        t.start()
        print chr(7)
        print chr(7)
    
    # class Server
    Je complète le post de VinsS par un commentaire explicatif en rouge dans ton code

    PS: Si tu prends l'habitude de fermer tes classes, tes fonctions et méthodes et tes blocs structurés (if; while; for) par un commentaire fermant (comme j'ai écrit), tu verras mieux où tu en es...
    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]

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/07/2012, 09h06
  2. [C#] Form: équivalent de pack() en Java
    Par therock dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/06/2006, 10h42
  3. [Débat] Java vs Python
    Par kedare dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 31/05/2006, 22h10
  4. [Architecture] Java et python.
    Par Extra-Nitro dans le forum Général Java
    Réponses: 22
    Dernier message: 04/02/2006, 19h38
  5. [JAVA et XML] Message XML avec paramètre JAVA
    Par MiJack dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 09/11/2005, 10h22

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