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 :

instance / class / static method


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Chômeur professionnel
    Inscrit en
    Novembre 2020
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chômeur professionnel

    Informations forums :
    Inscription : Novembre 2020
    Messages : 122
    Par défaut instance / class / static method
    Wesh les gars,

    1e question : savez vous comment on print dans la même action des variables d'instances et des variables de classe ?

    Exemple : class Client, instance pseudo et nom complet, et en variable de classe ils habitent tous à NYC. Je prends tout ça, une boucle, et hop chaque client pseudo, no complet et la ville par défaut. C'est possible de faire ça ?

    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
     
    # DEFINING THE CLASS
    class Client:
        city = "NYC"
        def __init__(self, username, fullname):
     
    # DEFINING THE ATTRIBUTES
            self.username = username # This is an instance variable
            self.fullname = fullname
     
    # DEFINING THE METHODS
        def printout(self):
     
     
    # This is an instance method I cannot print "city" from here. I need a class method.
     
        @classmethod
     
        @staticmethod
        ???
     
     
    first_client = Client("programmer_x", "John DOE")
    second_client = Client("undercover_dude", "Michael SMITH")
    2e question : je vois pas du tout à quoi sert staticmethod puisqu'on peut ni acceder aux variables d'instances ni aux variables de classe.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Bonjoir,

    la constante city peut très bien devenir un attribut avec "NYC" par défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Client:
        city = "NYC"
        def __init__(self, username, fullname):
            self.username = username # This is an instance variable
            self.fullname = fullname
            self.city = Client.city
    Pour afficher le contenu d'une instance Client, au choix en passant par une méthode à ajouter dans la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def affiche_contenu:
        print(self.__dict__)
    Ou directement dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client = Client(username, fullname)
    print(client.__dict__)

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 320
    Par défaut
    bonjour,

    Citation Envoyé par Yuseph Voir le message
    on print dans la même action des variables d'instances et des variables de classe ?
    cela ne change rien, une variable de classe est accessible de le même manière qu'une variable d'instance. Donc tu peux faire un code du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print f"{self.username}/{self.fullname} qui habite à {self.city}"
    Citation Envoyé par Yuseph Voir le message
    def printout(self):
    Il est possible de définir une méthode magique pour avoir un "print" de notre objet donc cette méthode n'a pas forcément à exister (même très rare)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        def __str__(self): 
            datas = {**vars(self), **{'ville': self.city}}
            return f"{datas}"
            # ou ? return f"{self.username}/{self.fullname} qui habite à {self.city}"
    ...
    print(first_client)
    Si tu ne vois pas l'utilité d'une méthode statique, c'est que tu n'en as pas besoin. c'est quelque chose de rare et pour des classes particulières ; c'est surtout pour organiser son code :
    un exemple avec Client (pas facile !!!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Client:
      @staticmethod def retourner_le_répertoire_des_clients() # change uniquement en fonction du système donc pas besoin d'un attribut de l'objet
      @staticmethod def créer_client_depuis_fichier(fichier_json) # json.load() ... return Client(json.pseudo, json.non)

  4. #4
    Membre actif
    Homme Profil pro
    Chômeur professionnel
    Inscrit en
    Novembre 2020
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chômeur professionnel

    Informations forums :
    Inscription : Novembre 2020
    Messages : 122
    Par défaut
    ok je zappe staticmethod du coup.

    pas mal vos codes. mais __dict__ j'ai pas vu ça dans les livres de débutant
    je fonctionne encore avec des boucles moi

    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
     
    # DEFINING THE CLASS
    class Client:
        city = "NYC" # This is a class variable
        def __init__(self, username, fullname):
     
    # DEFINING THE ATTRIBUTES
            self.username = username # This is an instance variable
            self.fullname = fullname
            self.city = Client.city
     
    # DEFINING THE METHODS
        def affiche_contenu(self):
            for loop_1 in self.__dict__.values():
                print(loop_1, end = " ")
     
     
    first_client = Client("programmer_x", "John DOE")
    second_client = Client("undercover_dude", "Michael SMITH")
     
    Client.affiche_contenu(second_client)
    là le résultat est impec mais vas falloir un peu de temps pour que j'assimile cette façon

    j'ai essayé la façon débutant mais j'arrive pas du tout à ajouter un espace entre chaque mot. si vous avez une idée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       def affiche_contenu(self):
            for loop_1 in self.username:
                print(loop_1, end ="")
            for loop_2 in self.fullname:
                print(loop_2, end ="")
            for loop_3 in self.city:
                print(loop_3, end = "")

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

    Citation Envoyé par Yuseph Voir le message
    j'ai essayé la façon débutant mais j'arrive pas du tout à ajouter un espace entre chaque mot. si vous avez une idée
    Si je dois afficher 3 variables sur une même ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a, b, c = 1, 2, 3
    >>> print(a,b,c)
    1 2 3
    >>>
    basique non?

    Et si vous ne comprenez pas le rapport avec ce que vous essayez de faire, il y a des exercices (corrigés) dans tous les bons tutos. Pour s'entraîner, c'est top.

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

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 823
    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 823
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Yuseph Voir le message
    ok je zappe staticmethod du coup.
    Absolument pas. Ce n'est pas parce qu'une variable/méthode de classe peut être appelée comme si c'était une variable/méthode d'instance que sa nature "appartenance à la classe" est à jeter.

    Citation Envoyé par Yuseph Voir le message
    pas mal vos codes. mais __dict__ j'ai pas vu ça dans les livres de débutant
    Non, c'est dans les livres avancés.
    C'est le dictionnaire qui contient tous les attributs et méthodes de la classe.

    Citation Envoyé par Yuseph Voir le message
    je fonctionne encore avec des boucles moi
    Moi aussi.
    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]

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsour !

    Je propose cette alternative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> class Client:
        def __init__(self, username, fullname):
    	# DEFINING THE ATTRIBUTES
            self.username = username # This is an instance variable
            self.fullname = fullname
            self.city = "NYC"
     
    >>> toto = Client("Toto","LeRigolo")
     
    >>> print(*vars(toto).values())
    Toto LeRigolo NYC
    On le voit pas tous les jours ce vars ni ce * dans un print(). ^^'

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 823
    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 823
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    On le voit pas tous les jours ce vars ni ce * dans un print(). ^^'
    Ouaip. Malheureusement on rajoute __slots__=("username", "fullname", "city") juste avant __init__() et ça ne marche plus...
    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. [C#] Multiple instance d'une dll ayant des classes static
    Par Saroumane dans le forum Débuter
    Réponses: 0
    Dernier message: 04/06/2012, 17h49
  2. Class static = instance unique ?
    Par maa dans le forum C#
    Réponses: 36
    Dernier message: 30/09/2007, 00h46
  3. Réponses: 4
    Dernier message: 27/07/2007, 20h34
  4. Classe interne, methode static et ajout de boutons
    Par comme de bien entendu dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 09/03/2006, 14h13
  5. Pb accès entre 2 classes static
    Par d.w.d dans le forum C++
    Réponses: 5
    Dernier message: 23/02/2005, 19h05

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