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:
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.
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:
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
Effectivement tout simple
Bonjour,
Effectivement, c'est tout simple, je découvre la flexibilité du langage ...
Merci, cela fonctionne parfaitement.
Olivier