Bonjour,
Imaginons que j'ai :
Je voudrai lancer la fonction "func" à partir de la Class A.Code:
1
2
3
4
5
6
7
8
9
10
11Class A . . . . Class B . . def func...
Est-ce possible ?
Merci
Version imprimable
Bonjour,
Imaginons que j'ai :
Je voudrai lancer la fonction "func" à partir de la Class A.Code:
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". :pastaper:
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... :google:
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-docCode:
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 :mouarf:
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:
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:
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:
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:
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:
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:
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 charabiaCitation:
Je voudrai lancer la fonction "func" à partir de la Class A.
Est-ce possible ?
Cordialement,
- W
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 inconnuCode:
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 ...
Salut,
Quel problème cherchez vous a résoudre ?
Est ce que des "nested classes" sont adaptées?
Le fait est qu'on peut faire tomber le truc en marche (mais vous ne donnez pas assez de code).
Si c'est juste pour le fun, il y a tellement de "drawbacks" que s'y acharner ne vaut peut être pas le coup.
- W
Aucun problème , juste une réponse à la question posé qui se traduit par oui , ca dépend et le fils essaie d'eclairer le 'ça depend'
un exemple d'appelle de class de meme niveau qui fonctionne ( en cours de debogage ) :Pièce jointe 140703
Elle peut le faire mais pas n'importe comment.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 class Foo(object): def __init__(self): print self.Baz.att_0 try: print self.Baz.att_1 except Exception as why: print why b = self.Baz() print "Attributs d'instance:" print b.att_0 print b.att_1 class Baz(object): att_0 = 'att_0' def __init__(self): self.att_1 = 'att_1' f = Foo()
Code:
1
2
3
4
5
6
7 vincent@tiemoko:~/Bureau$ python nested.py att_0 type object 'Baz' has no attribute 'att_1' Attributs d'instance: att_0 att_1
Voilà qui me rappelle furieusement ceci:Citation:
un exemple d'appelle de class de meme niveau qui fonctionne ( en cours de debogage ) :classappeal..jpg
http://www.developpez.net/forums/d14...nction-classe/
oui mon problème à moi reste entier dans le cas de l'exemple que j'ai linké ( un classe de gestion de fichier : autre partie du code du même programme )
dans mon cas je bataille avec des passages de paramètre différent dans le nombre d’argument qui m’empêche de faire des appelle direct
pour revenir à ton exemple :comment récupérer les attribut att_0 et att_1 depuis le core principal en dehors de la classe
Code:
1
2
3
4 f = Foo.Baz() print (f.att_0) print (f.att_1)