Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Général Python
Général Python Forum d'entraide sur les fondamentaux du langage Python, syntaxe, POO, bibliothèque standard, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/12/2012, 22h19   #1
LeHibou2
Membre du Club
 
Inscription : mai 2010
Messages : 164
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 164
Points : 41
Points : 41
Par défaut Acrobaties de variables

Bonjour à tous,

Depuis tout à l'heure j'ai réussi à faire la translation de programmes d'autres langages vers python.

Parfait. J'ai progressé.
Maintenant, savoir faire d'une manière c'est bien, mais j'aime la voltige.

Ma question, qui semblera sûrement idiote, est de la masturbation intellectuelle.

Soit fichier1 et fichier2, tel que :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
#! /usr/bin/python
#coding:utf-8
 
#FICHIER1
import fichier2
 
class maClasse1 :
    def __init__(self):
        '''mes définitions'''
    def roulebille():
        '''ici l'objet de la question'''
Et fichier2, fille
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
#! /usr/bin/python
#coding:utf-8
 
#FICHIER2
 
class maClass2(fichier1.maClasse1) :
 
  def __init__(self):
    fichier1.maClasse1.__init__(self)
 
  def cherche(self):
    '''ici pleins de variables locales'''
La question c'est de savoir si je peux réutiliser des variables locales définies dans cherche(), du fichier2, dans une nouvelle fonction du fichier1.
global ne m'a pas aidé.

Actuellement, je règle le problème en passant par des variables "self" du constructeur que je récupère.

Votre avis ?

Merci à vous,

A bientôt,

LeHibou
LeHibou2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 03h17   #2
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 942
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 942
Points : 1 413
Points : 1 413
Salut,

Tu l'a testé ?
Code :
1
2
3
4
5
6
7
 
#! /usr/bin/python
#coding:utf-8
 
#FICHIER2
 
class maClass2(fichier1.maClasse1) :
sans importer fichier1 ce sera difficile, et si tu importes fichier1 qui lui-même importe fichier2 tu crées une boucle d'import que Python rejetera immédiatement.

Et puis pourquoi veux-tu faire cet héritage, est-il justifié ?

Pour répondre à ta question:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#! /usr/bin/python
#coding:utf-8
 
#FICHIER1
from fichier2 import maClass2
 
class maClasse1(object):
    def __init__(self):
        '''mes définitions'''
 
    def roulebille(self):
        self.mc2 = maClass2()
 
        # Maintenant tu peux
        self.mc2.attribut_machin = 'foo'
        self.bar = self.mc2.attribut_chose
        # etc
Tu remarqueras quelques corrections.

Citation:
Envoyé par LeHibou2 Voir le message
Actuellement, je règle le problème en passant par des variables "self" du constructeur que je récupère.
Quoique la terminologie soit incorrecte, je crois comprendre ce que tu veux dire, c'est effectivement ainsi que l'on fait (donc comme dans mon exemple) et il est inutile de chercher une autre façon de faire.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 08h58   #3
LeHibou2
Membre du Club
 
Inscription : mai 2010
Messages : 164
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 164
Points : 41
Points : 41
Merci VinsS,

Je dois avouer qu'hier je n'avais plus les yeux en face des trous.
J'ai simplifié bêtement mon exemple et j'ai coupé des choses importantes.

Je ne m'en rendais même plus compte.

En tout cas, merci à toi,

A bientôt,

LeHibou
LeHibou2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 14h28   #4
LeHibou2
Membre du Club
 
Inscription : mai 2010
Messages : 164
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 164
Points : 41
Points : 41
Le plus simple étant -évidemment- de faire un return de la valeur de la fonction, voire un tuple, et de le réutiliser dans une variable temporaire...
LeHibou2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 20h11   #5
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 719
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 719
Points : 4 559
Points : 4 559
Si maClass2 hérite de maClass1 alors tous les attributs sont accessibles suivant "self":

Exemple:
Code :
1
2
3
4
5
6
7
8
9
10
class A:
    def foo(self):
         print (self.a)
 
class B(A):
    def __init__(self, a):
       self.a = a
 
b = B(3)
b.foo()
- W
__________________
Architectures Post-Modernes
wiztricks est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 20h41   #6
LeHibou2
Membre du Club
 
Inscription : mai 2010
Messages : 164
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 164
Points : 41
Points : 41
Oui, tu as raison, et je ne me permettrais pas de discuter cet état de fait.

Mais j'ai changé d'avis quant à la nécessité de faire un héritage en vue de débugger plus simplement.

Parce que le programme est devenu trop complexe avec des appels de partout et surveiller les variables ainsi que leur valeur d'appel devenait problématique.

Résultat : mise à jour du design -> pas d'héritage mais du transfert de valeur à la voltige avec contrôle des itérations.

Et là, l'air est revenu.

Bonne soirée et bonnes fêtes à vous

A bientôt,

LeHibou
LeHibou2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 06h12   #7
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 942
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 942
Points : 1 413
Points : 1 413
L'héritage te permet de faire ceci:
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
 
# -*- coding: utf-8 -*-
 
class A(object):
    def __init__(self):
        pass
 
    def abrege(self, chain):
        return chain[:5] + '...'
 
class B(A):
    def __init__(self):
        super(B, self).__init__()
 
    def format(self, st):
        if len(st) > 8:
            st = self.abrege(st)
 
        return st
 
a = A()
b = B()
 
print b.format('Supercalifragilistisexpidilicious')
où tu peux constater que B a hérité de la méthode abrege() de A.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 11h26   #8
LeHibou2
Membre du Club
 
Inscription : mai 2010
Messages : 164
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 164
Points : 41
Points : 41
C'est très vrai VinsS,


Tu as instancié "a" pour une raison particulière ?
LeHibou2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 11h39   #9
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 942
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 942
Points : 1 413
Points : 1 413
Citation:
Envoyé par LeHibou2 Voir le message
Tu as instancié "a" pour une raison particulière ?

Non, l'habitude.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 12h37   #10
LeHibou2
Membre du Club
 
Inscription : mai 2010
Messages : 164
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 164
Points : 41
Points : 41
Merci beaucoup de tes lumières,

Elles me seront utiles dans un cas que je prévois.

A bientôt,

LeHibou
LeHibou2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h33.


 
 
 
 
Partenaires

Hébergement Web