Bonjour,
Imaginons que j'ai :
Je voudrai lancer la fonction "func" à partir de la Class A.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11Class A . . . . Class B . . def func...
Est-ce possible ?
Merci
Bonjour,
Imaginons que j'ai :
Je voudrai lancer la fonction "func" à partir de la Class A.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11Class A . . . . Class B . . def func...
Est-ce possible ?
Merci
Salut,
Littéralement B.func(...) répond a votre question.
Mais il serait bon que vous précisiez ce que vous voulez faire.
Est ce que le sujet porte sur:
- ce que fait ou pas l'interpréteur Python?
- la différence entre classes et instances?
- les différentes méthodes de la POO permettant de les associer?
Cordialement,
-W
"Yes you can".
mais plus sérieusement il faut d'abord éclaircir les "détails" mentionnés par wiztricks.
Alors en gros on a:
1- ce que fait [ou pas] l'interpreteur: il peut faire B.func(...) le "soucis" c'est de passer les arguments corrects en nombre et en type(surtout le premier, de type <B>) à la classe si la méthode <B.func> n'est pas statique, et juste les arguments si elle l'est.
2- la différence entre classes et instance... je pense que c'est pas le gros du soucis sinon...
3- les différentes méthodes de la POO permettant de les assosier:
Dans ce cas, la principale méthode (pour rendre la classe statique, serait):
-- directement tiré du Python-doc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 class C: @staticmethod #decorateur def f(arg1, arg2, ...): ...
En espérant ne pas me déplacer dans le sens de la tangente![]()
Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
CONTENU D'UNE QUESTION
Exemples:
- Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
- Code source du morceau de programme où il y a un bogue
- Ligne de code sur laquelle le bogue apparaît
- Erreur complète retournée pas l'interpréteur Python
- Recherche déjà effectuée (FAQ, Tutoriels, ...)
- Tests déjà effectués
Salut,
Profitons de la réponse d'afranck64 pour clavarder (un peu) sur le premier point.
Lorsqu'on écrit:
l'interpréteur rencontrant le mot clé "def" va créer un objet "fonction" avec la définition qui suit et l'associer à la clé "bar" dans globals().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 >>> def bar(*args): ... print (', '.join(str(x) for x in args))
Pour les fonctions déclarées dans les classes, c'est un peu pareil...
Mais forçons le trait en définissant la fonction ainsi:
Rencontrant le mot clé "class", l'interpréteur crée un objet "class".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2>>> class A: ... foo = bar
Dans sa définition, nous disons que l'attribut "foo" sera définit par ce qu'il trouvera du "bar" dans globals().
L'objet fonction "bar" peut maintenant être accédé via deux chemins:
- "bar" résolu dans globals()
- "A.foo" résolu dans globals() puis dans le dict associé à la class A.
Nous avons ici quelque chose qui n'est pas "intuitif" et qui "perturbe" les débutants ou les habitués à des langages "compilés" : bien qu'en relation, espace de nommage (désigner, trouver les objets associés à des noms) et espace des objets sont distincts.
Parfois nous confondons aussi "nom du chemin" et de l'objet, en fait, ils n'ont rien à voir!
Le nom de l'objet est stocké dans l'attribut "__name__". Initialement, il est crée avec le même nom qui sera donné à la clé entré dans globals().
Mais il peut être changé:
sans que le comportement de l'objet "fonction" en soit affecté.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 >>> bar.__name__ = 'quux' >>> A.foo <function quux at 0x024FB198>
La différence entre méthodes et fonctions se ramène à l'existence et au type du premier argument de la "fonction" lorsqu'elle sera appelée, au fait que la fonction soit "bound" ou pas avec un objet.
Instancions A:
Le premier argument de la fonction sera l'objet instance de "A" qui aura servit à désigner la fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 >>> a = A() >>> a.foo() <__main__.A object at 0x024FAA30>
note: c'est la même fonction "foo", ce qui change c'est ce que fait l'interpréteur du contexte a.foo au moment de l'appel.
Nous pourrions forcer "foo" à être méthode de classe:
Dans ce cas, le premier argument sera la classe et non plus l'instance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 >>> A.foo = classmethod(A.foo) >>> a.foo <bound method type.foo of <class '__main__.A'>> >>> a.foo() <class '__main__.A'>
=> Une méthode un objet particulier réalisé en associant une fonction avec un objet "class" ou "instance".
On peut la délier:
Cela étant dit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 >>> b = a.foo >>> obj = b.__self__ >>> z = b.__func__ >>> z(1,2,3) 1, 2, 3
On peut dire "yes we can"... mais désolé, pour moi, c'est du charabiaJe voudrai lancer la fonction "func" à partir de la Class A.
Est-ce possible ?
Cordialement,
- W
Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
CONTENU D'UNE QUESTION
Exemples:
- Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
- Code source du morceau de programme où il y a un bogue
- Ligne de code sur laquelle le bogue apparaît
- Erreur complète retournée pas l'interpréteur Python
- Recherche déjà effectuée (FAQ, Tutoriels, ...)
- Tests déjà effectués
yes you can ... mais python n'aime pas forcement ,
l'ordre de déclaration d’accès aux objets de class peut-être important , exemple si vous avez affaire à une classe imbriquée
la classe A ne peut pas appeler d'objet de la classe B dans le def par exemple car celle ci est inconnu
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class A (object) : def _ini_ (self...) ... Class B (object) : def _ini...
pour ma part je 'nage' ou plutot rame avec la récuperation d'objet de la classe ...puré héritage et de liaison .. j'ai du mal à comprendre l'affectation que l'affection de nouvelle variable avec le resultat d'une fonction ne soit qu'une copie d'instance ...
Partager