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

  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 705
    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 705
    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 822
    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 822
    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 822
    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 822
    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]

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'utilise trop peu la POO pour connaître ces subtilités...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(*[getattr(toto,x) for x in dir(toto) if not '_' in x])
    Mais ça ne me les sort pas dans le "bon" sens...

  10. #10
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 919
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Citation Envoyé par Sve@r Voir le message
    Ouaip. Malheureusement on rajoute __slots__=("username", "fullname", "city") juste avant __init__() et ça ne marche plus...
    Tu chipottes.. et puis dans ce cas ça ne marchera pas non plus avec la proposition contenant __dict__ .

    Citation Envoyé par Yuseph
    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
       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 = "")
    Tu ne serais pas entrain de nous balader? J'ai du mal à croire que tu ne maitrises pas un simple affichage ... et puis tous ces loops inutiles ça ressemble à de la surenchère pour bavard
    Après tout qu'importe, tant que le moulin tourne , moi ça me va

  11. #11
    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
    Pour moi, la proposition de Arioch est clairement à ne pas faire en général
    1) on a X variables à la place d'une seule donc on utilise beaucoup plus de ram pour pas gand chose (à la place d'écrire quelques lignes de code)
    2) on peut avoir un comportement totalement erroné ! Si l'on modifie Client.city alors le fonctionnement des objets Client est faux puisque la variable d'instance n'est pas modifiée
    3) A minima on n'utilise pas deux nom identiques pour 2 variables différentes ! class: _city et city pour l'instance (qui peut-être aussi une fonction attribut)

    -------

    L'exemple ici est un cas trop particulier pour en définir une bonne règle ... Mais on pouvait se passer de variable de classe et simplement faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def __init__(self, username, fullname, city="paris"):
    -------

    Si le but de Yuseph est de faire plusieurs affichages différents à partir d'un objet avec des datas qui sont éparpillées dans cet objet, il est possible de rendre cet objet itérable.
    Tout le travail est à faire dans __iter__() __next__()
    par exemple, pour ce cas simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Client:
        ...
        def __iter__(self):
            items = ("city", "username", "fullname")
            return iter({(k,getattr(self, k)) for k in items})
    Maintenant il est simple de faire une boucle sur les données depuis l'extérieur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for k,v in first_client:
        print(k, ":", v)
    # ou
    print([i for i in first_client])

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 822
    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 822
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Tu chipottes..
    Yep (c'est tellement drôle ). Mais en même temps c'est quand-même bon de montrer les limites de certains trucs

    Citation Envoyé par Hominidé Voir le message
    et puis dans ce cas ça ne marchera pas non plus avec la proposition contenant __dict__ .
    Ah tout à fait, j'ai lu le topic en diagonale et je n'ai pas fait attention (si j'avais vu ces for loop avant toi j'aurais bondi)

    Citation Envoyé par papajoker Voir le message
    print([i for i in first_client])
    print(list(first_client)) (ouais je chipote encore )

    [edit]ok, j'ai lu le topic
    Citation Envoyé par Yuseph Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 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)
    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 python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # DEFINING THE METHODS
    def affiche_contenu(self):
    	print(" ".join((self.username, self.fullname, self.city)))
     
    first_client = Client("programmer_x", "John DOE")
    second_client = Client("undercover_dude", "Michael SMITH")
    second_client.affiche_contenu()
    Et effectivement dans ce cas là, staticmethod n'a pas lieu d'être vu que la méthode "affiche_contenu()" est spécifique à chaque instance.

    Citation Envoyé par Yuseph Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    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 = "")
    Boucles débiles mais tu aurais pu au-moins utiliser la même variable pour les trois...
    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