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 :

Variables statiques ou décorateur [Python 3.X]


Sujet :

Python

  1. #1
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Variables statiques ou décorateur
    Bonjour,

    J'ai une classe User, que je souhaite utiliser dans tout mon code car je suis en train d'écrire
    une appli pour faire un prompt. Dans ce cadre, j'utilise la librairie CMd. mais ce n'est pas le sujet.
    Je ne sais pas comment passer mon user à ma classe Prompt au sens ou il existe pas de méthode
    pour passer un objet ?
    C'est une librairie https://docs.python.org/fr/3.6/library/cmd.html

    Je ne vois pas comment créer une valeur statique dans un objet,
    afin d'être utilisé par tous les objets autres.

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    class User():
    """docstring for User."""
    global _user
        global _password
        _menu = """Votre identifiant:
        """
    _key = None
        def __init__(self):
            pass
        def getUser(self):
            return self._user
        def setUser(self, user):
    logging.disabled = True
    logging.info('We processed %s records', user)
            self._user = user
    def getUser(self):
            return self._user
        def getPassword(self):
            return self._password
        def setPassword(self, password):
    logging.info('We processed %s record password', password)
            self._password = password
    def display(self):
    self._key = open(os.path.expanduser('~/.ssh/id_rsa.pub')).read()
            self.setUser(input(self._menu))
            password = getpass(prompt='Mot de passe : ', stream=None)
            self.setPassword(password)
            logging.info('Save connexion configuration %s ', password)
    
        ''' Return key connexion'''
    def getkey(self):
            return self._key
    
    
    class Menu:
    _fileEnv = None
    _user = None
    _hosts = None
    _db = None
    _port = 22
    _selection = None
    _MenuSelect = {
            1: "AddSshKeys",
            2: "AddConfigEnv",
            3: "ListServerUp",
            4: "UpdateYum",
            5: "displayEnv",
            6: "end"
    }
        _clientSsh = None
    _retry = 3
    _delay = 5
    _timeout = 3
    _menu = """
    #####################################################################
    - Choisir l'action à effectuer sur :
           [1]. Déployer sa clef ssh public sur des serveurs
           [2]. Configurer les variables d'environnements
           [3]. Lister les serveurs dispo. en base
           [4]. Faire la mise à jour de la liste des serveurs
           [5]. Afficher les variables d'environnements
           [6]. Quitter/Sortir
    #####################################################################
        """
    _barresplit ='''
    #####################################################################\n    '''
    def __init__(self, user):
    self._fileEnv = None
    self._user = user
    self._db = TinyDB('../data/db.json')
    
        def display(self, prompt=False):
    print(u"xxxxxxxxxxxxxx ")
            if(prompt):
    print("Client en mode prompt ...")
                self.prompt()
            else:
    print("Client avec menu interactif ...")
                if (self._hosts == None):
    self.choiceFromServer()
                else:
    print(u'Utilisation des serveurs en mémoire')
    
                self._selection = -1
    while self._selection:
    print(self._menu)
                    self._selection = int(input("Choisir une option : "))
                    if (self._selection >= 0) and (self._selection <= 6):
    logging.info(self._MenuSelect[self._selection])
                         getattr(self, self._MenuSelect[self._selection])()
    
        def prompt(self):
    monPrompt().cmdloop() <- ??? comment utiliser l'objet User dans cette Classe ou je n'ai pas la main ? décorateur ?? ou objet Statique ?
    ....
    
    class CloePrompt(Cmd):
    intro = 'Outil de commande cliente ?[command] [option]\n' \
                'Liste :\n' \
                'servers        :   Liste des serveurs disponibles\n' \
                'addServer [IP] :   Ajouter un serveur\n' \
                'rmServer [IP]  :   Effacer un serveur\n' \
                'addFileServer  :   Ajouter une liste de serveur par fichier\n'\
                'pingServers    :   Tester si les serveurs sont up\n' \
                'sshClient [IP] :   Se connecter en ssh à n client\n' \
                'cls            :   Cls ou Clear screen, efface écran'\
                'quit :         :   Quitter\n'
    prompt =  '>'
    _db = None
    _hosts = None
    _port = 22
    _retry = 3
    _delay = 5
    _timeout = 3
    
    
    def __init__(self):
    super().__init__()
            self._db = DbDao()
    
            print("user {user}".format(user=_user)) <--- Euh Oups marche pas, mais je ne sais pas comment faire, car je veux une instance déjà initialisée dans la classe principale
    
        def do_servers(self, args):
    """servers command. If you provide <option>, it will greet you with it."""
    if len(args) == 0:
    name = "Vous n'avez pas choisi d'option"
    else:
    name = args
    print("Votre option, %s" % name)
    Merci de vos conseils, ne faites pas attention à l'indentation, la recopie du code a été ... moyen. mais chez moi, c'est correct.
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par nathieb Voir le message
    Je ne vois pas comment créer une valeur statique dans un objet,
    afin d'être utilisé par tous les objets autres.
    Il faudrait déjà définir ce que pourrait être "valeur statique dans un objet" avant de pouvoir imaginer comment le coder avec Python.

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

  3. #3
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Objet statique définition
    Bonjour,

    Oui effectivement, une mauvaise expression de ma part.
    Je pense effectivement à la notion d'attribut statiques ou de méthode statique dans un objet
    tel que le définit python. J'avoue que je ne suis pas à l'aise sur l'utilisation dans ce langage.

    J'ai trouvé un ressource sur la notion d'immutabilité :
    Le cas des immutables

    La méthode __new__ est particulièrement utile pour les objets immutables. En effet, il est impossible d’agir sur les objets dans la méthode __init__, puisque celle-ci intervient après la création, et que l’objet n’est pas modifiable.
    Si l’on souhaite hériter d’un type immutable (int, str, tuple), et agir sur l’initialisation de l’objet, il est donc nécessaire de redéfinir __new__. Par exemple une classe Point2D immutable, qui hériterait de tuple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Point2D(tuple):
        def __new__(cls, x, y):
            return super().__new__(cls, (x, y))
     
        @property
        def x(self):
            return self[0]
     
        @property
        def y(self):
            return self[1]

    Cordialement Olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par nathieb Voir le message
    Oui effectivement, une mauvaise expression de ma part.
    Je pense effectivement à la notion d'attribut statiques ou de méthode statique dans un objet tel que le définit python. J'avoue que je ne suis pas à l'aise sur l'utilisation dans ce langage.
    Je ne vous demandais pas à quoi cela pouvait ressembler en Python mais ce que vous cherchiez à en faire pour voir comment on pourrait le réaliser (pour autant que çà ait du sens).

    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class A:
            variable = 123
    alors variable peut être considéré comme "statique".
    Et une méthode "statique" est une simple fonction(*) rangée dans une "class":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class A:
            def f():
                  pass
    (*) la différence avec les autres méthodes est qu'il n'y a pas de lien avec un objet qui deviendra premier paramètre de... lors de l'appel.

    Par exemple, __new__ est une méthode "statique" (au sens Python du terme).

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

  5. #5
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Qu'est ce qui t'empèche de mettre user en paramètre de ta classe prompt ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class CloePrompt(Cmd):
        def __init__(self, user):
            super().__init__()
            self._db = DbDao()
     
            print("user {user}".format(user=user))

  6. #6
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Effectivement tout simple
    Bonjour,

    Effectivement, c'est tout simple, je découvre la flexibilité du langage ...

    Merci, cela fonctionne parfaitement.

    Olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/11/2006, 13h55
  2. Réponses: 14
    Dernier message: 05/09/2006, 01h17
  3. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35
  4. Utilisation d'une variable statique
    Par kurkaine dans le forum C++Builder
    Réponses: 6
    Dernier message: 14/06/2006, 13h49
  5. Exportation de variable statique
    Par Laurent Gomila dans le forum C++
    Réponses: 16
    Dernier message: 31/08/2005, 16h32

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