bonjour j'aimerais savoir s'il est possible de faire entrer des données extérieures à un programme pour les intégrer à une classe en plein fonctionnement dans celui-ci sans réinitialiser celle-ci.
bonjour j'aimerais savoir s'il est possible de faire entrer des données extérieures à un programme pour les intégrer à une classe en plein fonctionnement dans celui-ci sans réinitialiser celle-ci.
Salut,
Il suffit de le programmer....
- W
Bonjour
Le souci principal c'est que tu n'emploies pas les bons termes, ce qui t'empêche alors de comprendre le comment des choses. Et comme ton besoin est assez trivial, c'est pour ça que wiztricks t'a répondu comme il l'a fait.
Une classe ne "fonctionne" pas, elle est "instanciée" (créée) dans une variable. Cela signifie qu'il existe une variable du type de cette classe. Et donc tout comme tu écris a=int(5) (ou plus simplement a=5), tu "instancies" une variable de type "int" dans "a" ; quand tu écris b=toto() tu instancies une variable de type "class toto" dans "b" (pour peu que le code définissant la classe "toto" existe).
Donc si j'écris cette class toto de cette façon...
... je n'ai pour l'instant rien de concret. J'ai juste un nouveau type "class toto" qui me permettra, si je le souhaite, de créer alors une variable de ce type (instanciation).
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class toto: def __init__(self, n): self.n=n # class toto
Ensuite je peux écrire a=toto(123). Là ça devient concret. Maintenant, j'ai une variable, c'est à dire une entité me permettant d'y stocker de la valeur. De là je peux alors écrire print(a.n) et obtenir "123" à l'écran. Et je peux ensuite écrire a.n=456. Ainsi, j'ai modifié l'attribut "n" de la classe "toto" instanciée dans "a". Et si ce "456" provient d'une saisie clavier, d'un fichier, d'une bdd, d'un socket réseau, c'est alors bel et bien une donnée extérieure au programme que j'aurai intégré dans ma classe "toto" instanciée dans "a". Ce qui correspond donc à ta question. Mais dans tout ce processus, il n'y a eu à aucun moment la notion de "classe en fonctionnement".
Ensuite dans le monde professionnel, on n'aime pas trop qu'un attribut soit directement modifiable de l'extérieur sans contrôle. On préfère alors le "privatiser" et offrir aux utilisateurs des outils de récupération et de modification (getters/setters) ce qui permet alors de contrôler ce qui entre mais ça c'est pour après.
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]
étant autodidacte je me sers ce dont j'ai appris, désolé de ne pas utiliser les termes officiels et pour votre collègue je tiens à dire quelque chose :je suis quelqu'un qui a souvent vécu de l'exclusion et harcèlements divers et donc sa réponse m'a donné l'impression d'être rejeté et donc l'envie de lui rentrer dedans sans discuter ou chercher à aller plus loin. tout ça parce qu'au lieu de respecter 'les règles', qu'au demeurant je ne suis pas censé connaitre, j'ai osé poser une question. il m'aurait posé des questions pour en savoir plus, savoir ce que j'ai voulu demander je lui aurait répondu avec joie ou il m'aurait dirigé vers des blog, forums qui m'auraient donné la réponse à ma question je m'en serais contenté. là je me suis même demandé si le signaler à la modération pour exclusion n'aurait pas été une bonne chose. peut être qu'être moins rigoureux avec des gens qui viennent d'un éventail plutôt large d'endroits et de motivations différentes serait une bonne amélioration.
donc voici mon problème j'ai une classe qui utilise une base de données or pour éviter de trop devoir refaire un son cœur gérant les liens avec les bases de données j'ai fait un programme dans un autre fichier(fichier.py). le problème c'est quand celui-ci répond à la classe qui a fait la demande, elle se réinitialise de par la commande import. si je ne vous envoie pas de code c'est parce que j'aimerais non pas que vous corrigiez mon code, mais seulement que vous me disiez s'il y a une méthode viable qui me serait inconnue et si oui laquelle. quant à la modification de paramètres dans une classe, ça m'étonne qu'avoir des classes qui discutent entre elle au sein d'un ensemble de programmes fermés sur un appareil pas forcément connecté ne soit pas plus utilisé. vu que parfois pour des utilisations complexes plusieurs objets (classes) peuvent être utiles.
C'est la raison pour laquelle poster du code plutôt que de donner des explications incompréhensibles est toujours préférable: le code illustre (peu ou prou) ce que les mots n'arrivent pas à exprimer.
Une méthode s'applique à une classe de problèmes encore faut il comprendre ce qu'il faut résoudre pour savoir laquelle appliquer.
- W
Bon, ok, plusieurs notions à aborder.
Tout d'abord le "import" dont tu parles ne sert pas à "initialiser" une classe, mais à importer (un peu comme "recopier") le code importé. Si je reprends mon exemple avec ma "class toto" et que je mets cet exemple dans un fichier "xxx.py", je peux alors importer cette "class toto" de plusieurs façons
- import xxx. J'ai alors accès à "toto" sous le nom "xxx.toto" => a=xxx.toto(123). Ca permet d'importer plusiers sources distincts qui auraient tous éventuellement eux-même leur propre "class toto" sans souci d'homonymie
- from xxx import toto (ou from xxx import *). J'ai alors accès à "toto" de façon directe, sous le nom "toto" => a=toto(123), exactement comme si j'avais créé cette classe dans le code qui l'importe. Plus simple d'utilisation mais évidemment souci si plusieurs imports ayant tous un même nom de classe
Donc ce n'est pas le import qui initialise la classe, mais peut-être le programme qui effectue cet import qui, lui, est relancé à chaque fois. Ca c'est un des fondamentaux de tous les systèmes d'exploitation, un programme qui s'arrête perd tout ce qui était dans sa mémoire, et s'il est relancé, il est alors réinitialisé à 0 (quitte ensuite à récupérer son travail précédemment enregistré à condition qu'il soit prévu pour ça et qu'il y ait eu effectivement un enregistrement à un moment donné).
Non, malheureusement non. Si un programme est réinitialisé, il ne pourra récupérer un travail précédent que si ce travail a été alors sauvegardé sur un support externe et si le programme est prévu pour faire ce genre de récupération. Bref que si cette notion de "pérennisation de l'info" a été prévue par le concepteur du programme.
C'est utilisé mais cela fait partie d'un domaine de la programmation appelé "communication inter-processus" qui explicite les différents moyens qu'ont des programmes de communiquer entre eux. Et cela transcende Python qui n'est qu'un langage parmis d'autres. Toutefois Python possède quand-même des outils de communication inter-processus (pipes, sockets, fichiers, bdd) mais c'est à toi de les implémenter quand tu en as besoin, et c'est alors à toi de définir tout le protocole (quand écrire, quand lire, etc)
Et pourquoi ne pas récupérer cette classe déjà existante (donc sans la refaire) tout en l'enrichissant de fonctionnalités qui t'intéressent ? C'est ce qu'on nomme "l'héritage". Je récupère le travail d'un autre et j'y ajoute ce qui me plait. Et je n'ai même pas besoin de me plonger dans le code de la classe récupérée, j'ai juste à savoir ce que fait cette classe et comment on s'en sert.
Reprenons mon "toto" de l'exemple précédent. Toi de ton côté tu récupères ce toto via un import et tu vois que tout génialissime qu'il est, il te manque à toi une seconde possible valeur et surtout un truc pour (par exemple) doubler la première valeur stockée.
Il te suffit alors d'écrire
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 # L'objet qui hérite (récupère) toto class totoPlus(toto): # Tout d'abord, le constructeur permettant d'y mettre éventuellement une seconde valeur def __init__(self, n, m=0): # Ce constructeur doit d'abord faire appel au constructeur de "toto" pour bénéficier de son travail sur la première valeur super().__init__(n) # Il doit maintenant stocker la seconde valeur self.m=m # __init__() # Ensuite la méthode dont tu as besoin et permettant de doubler la valeur initiale def double(self): self.n*=2 # class totoPlus
Sans même avoir besoin de plonger dans le code de toto, ce nouvel objet récupère intégralement tout ce qui faisait sa richesse et y rajoute tes propres richesses. Tu peux l'utiliser exactement de la même façon que tu utilisais "toto" => a=totoPlus(123); print(a.n). Mais tu peux aussi l'utiliser en prenant en compte ce qui a été rajouté en plus => b=totoPlus(456, 789); b.double(); print(b.n, b.m).
Bref un objet quel qu'il soit peut toujours être enrichi sans même avoir besoin de regarder comment il travaille.
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]
Un ensemble de programmes peut toujours échanger des données (tout en étant écrits dans différents langages de programmation) pourvu que cela ait été conçu et construit pour.
Utiliser (ou pas) des classes pour écrire un programme n'apporte rien à ses fonctionnalités (ce que le programme fait), çà change juste l'organisation des lignes de codes et peut éventuellement faciliter l'écriture du programme (pas ses fonctionnalités, ce qu'il fait).
Pour le reste, vous pouvez faire autant d'import que vous voulez, dans la pratique, l'exécution des lignes de code du fichier correspondant ne sera fait qu'une fois (que ces lignes de code définissent une classe ou pas).
- W
en gros je devrais utiliser les fonctions d'héritages des classe en utilisant le programme de gestion de base de données comme 'mère' hum je n'y avais pas pensé merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager