Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

classe parent

29 réponses
Avatar
JB
Bonjour a tous...

Peut etre une question de newbie mais je n'ai pas reussi à trouver de
réponse, surement que j'utilise les mauvais termes...

Voila j'ai une classe A qui a comme attribut une classe B

class A:
def __init__(self):
self.valeur="test A"
self.b=B()
class B:
def __init__(self):
self.valeur="test B"

comment faire pour récupérer A.valeur directement depuis B ?

faut il forcement, lors de l'instanciation de B, indiquer un lien vers A
? (self.B.A = self par exemple)

ou y a t il un moyen plus classe de trouver la classe 'parente' de B
directement?

voila, je suis sur que Python propose une solution pythonesque pour ca ;)

merci a tous

a+

Julien

10 réponses

1 2 3
Avatar
JB
Sauf raison majeure, utilise de préférence le "nouveau" (si l'on peut
dire - il date de la 2.3 SJMSB) modèle objet:

class MonServeur(object):

def __init__(self):
self.params = {}
self.http_server = HttpServer()



quelle est la difference ? le (object) apres le nom de la classe ? il y
a une PEP, un guide pour ca ?

Cet exemple ne correspond pas à la description que tu fais plus haut. Le
seul attribut propre de la *classe* MonServeur est la fonction __init__
- qui n'est pas une classe. Et les attributs *d'instance* ne sont pas
des classes, mais une instance de dict et une instance de HttpServer. Ne
va pas croire que les problèmes de terminologie sont sans importance, on
ne peut pas raisonner clairement dans ce domaine si on se mélange dans
les concepts.

Accessoirement, je te rappelle qu'en Python *tout* est objet (même les
fonctions, les classes et les modules). Que l'objet soit un type builtin
avec une notation littérale ou une instance d'une classe que tu a défini
toi-même n'y change rien.


c'est marrant coder en python me parait plus naturel et facile que de
l'expliquer !!

comment faire pour que http_server puisse utiliser des parametres
définis par ma classe 'principale' ?
En les lui passant ?



Je me disais qu'il y avait peut etre mieux que de passer le dico config
a chaque instance

sinon comment faire autrement ?


Impossible de répondre utilement sans connaissance de la classe
HttpServer, dont tu ne précises ni la provenance ni l'API.


HttpServer ce serait du ThreadedHttpServer, mais je pourrai aussi avoir
du JabberClient et d'autres classes diverses et variées qui auraient
besoin de partager les memes infos avec la classes 'mere'

Je crois que je m'exprime tres mal donc je reviens vers vous avec un
message mieux pensé. Merci en tous cas pour les precisions
terminologiques et pythonesques c'est plus clair pour moi.

bonne journée a tous ;)

Julien


Avatar
Jerome

"certains de ces attributs sont d'autres classes"
=> d'autres instances de classes j'imagine ? Si oui c'est un peu le
cas de tous les attributs dans un langage objet.


Oui, bien dit, surtout en python ;)

Ta classe principale est MonServeur c'est ça ?

Je dirais naïvement au vu de ces informations qu'il est possible que
ton serveur soit une spécialisation d'un serveur Http auquel cas tu
peux définir un vrai lien d'héritage

class MonServeur(HttpServer):

Sinon, à la création de l'instance self.http_server, tu peux passer au
constructeur les paramètres dont tu auras besoin pour configurer ton
serveur Http.

self.http_server = HttpServer(self.params.port, self.params.host)


Beh en fait MonServeur fait serveur HTTP mais aussi plusieurs autres
choses dont un client Jabber et d'autres classes donc je voudrai créer
une classe principale qui regroupe toutes les fonctions (gérées par
d'autres classes) mais qui regroupe les infos utiles, par exemple un
dico de configuration qui pourrait etre partagé entre les différentes
classes


Ben si je comprends bien ce que tu cherches à faire la méthode la plus
propre est de passer les bons paramètres à la création des différentes
instances.

Après si tu veux vraiment passer ton dictionnaire de configuration à
chaque instance rien ne t'en empèche. Il faut juste se rendre compte que
tu ne dupliques pas ton dictionnaire de configuration mais que tu passes
la référence du dictionnaire.


Tu peux faire quelquechose comme :

class Appli(object):
def __init__(self):
self.config = Config()
self.http_server = HttpServer(self.config)

class Config(object):
def __init__(self):
self.port = 20

class HttpServer(object):
def __init__(self, cfg):
self.port = cfg.port


Avatar
Jerome

Sauf raison majeure, utilise de préférence le "nouveau" (si l'on peut
dire - il date de la 2.3 SJMSB) modèle objet:

class MonServeur(object):

def __init__(self):
self.params = {}
self.http_server = HttpServer()



quelle est la difference ? le (object) apres le nom de la classe ? il y
a une PEP, un guide pour ca ?


C'est arrivé avec la version 2.2. C'est une amélioration du modèle objet
de python.

http://www.python.org/doc/2.2.3/whatsnew/sect-rellinks.html


Cet exemple ne correspond pas à la description que tu fais plus haut.
Le seul attribut propre de la *classe* MonServeur est la fonction
__init__ - qui n'est pas une classe. Et les attributs *d'instance* ne
sont pas des classes, mais une instance de dict et une instance de
HttpServer. Ne va pas croire que les problèmes de terminologie sont
sans importance, on ne peut pas raisonner clairement dans ce domaine
si on se mélange dans les concepts.

Accessoirement, je te rappelle qu'en Python *tout* est objet (même les
fonctions, les classes et les modules). Que l'objet soit un type
builtin avec une notation littérale ou une instance d'une classe que
tu a défini toi-même n'y change rien.


c'est marrant coder en python me parait plus naturel et facile que de
l'expliquer !!


Etre capable d'exprimer correctement ce que l'on cherche à faire permet
en général de mieux modéliser le problème et permet de gagner du temps
pour l'implémenter après


comment faire pour que http_server puisse utiliser des parametres
définis par ma classe 'principale' ?
En les lui passant ?



Je me disais qu'il y avait peut etre mieux que de passer le dico config
a chaque instance


Tu ne passes pas le dictionnaire, seulement une référence à ce questionnaire


sinon comment faire autrement ?


Impossible de répondre utilement sans connaissance de la classe
HttpServer, dont tu ne précises ni la provenance ni l'API.


HttpServer ce serait du ThreadedHttpServer, mais je pourrai aussi avoir
du JabberClient et d'autres classes diverses et variées qui auraient
besoin de partager les memes infos avec la classes 'mere'

Je crois que je m'exprime tres mal donc je reviens vers vous avec un
message mieux pensé. Merci en tous cas pour les precisions
terminologiques et pythonesques c'est plus clair pour moi.


de rien


bonne journée a tous ;)

Julien




Avatar
JB

Sauf raison majeure, utilise de préférence le "nouveau" (si l'on peut
dire - il date de la 2.3 SJMSB) modèle objet:

class MonServeur(object):

def __init__(self):
self.params = {}
self.http_server = HttpServer()



quelle est la difference ? le (object) apres le nom de la classe ? il
y a une PEP, un guide pour ca ?


C'est arrivé avec la version 2.2. C'est une amélioration du modèle objet
de python.

http://www.python.org/doc/2.2.3/whatsnew/sect-rellinks.html


Super, merci je vais regarder ca attentivement (je suis en retard!!)

a+

Julien




Avatar
JB
Après si tu veux vraiment passer ton dictionnaire de configuration à
chaque instance rien ne t'en empèche. Il faut juste se rendre compte que
tu ne dupliques pas ton dictionnaire de configuration mais que tu passes
la référence du dictionnaire.

Tu peux faire quelquechose comme :

class Appli(object):
def __init__(self):
self.config = Config()
self.http_server = HttpServer(self.config)

class Config(object):
def __init__(self):
self.port = 20

class HttpServer(object):
def __init__(self, cfg):
self.port = cfg.port


Ok c'est a peu pres ce que je fais actuellement, mais ce qui m'embete
c'est de passer plusieurs fois les memes parametres a plusieurs
instances d'une meme instance.... a force de coder en python on devient
flemmard ;)

Merci a tous pour vos contributions

Julien

Avatar
Bruno Desthuilliers

Sauf raison majeure, utilise de préférence le "nouveau" (si l'on peut
dire - il date de la 2.3 SJMSB) modèle objet:

class MonServeur(object):

def __init__(self):
self.params = {}
self.http_server = HttpServer()



quelle est la difference ? le (object) apres le nom de la classe ?


Oui.

il y
a une PEP, un guide pour ca ?


http://python.org/doc/newstyle/

Cet exemple ne correspond pas à la description que tu fais plus haut.
Le seul attribut propre de la *classe* MonServeur est la fonction
__init__ - qui n'est pas une classe. Et les attributs *d'instance* ne
sont pas des classes, mais une instance de dict et une instance de
HttpServer. Ne va pas croire que les problèmes de terminologie sont
sans importance, on ne peut pas raisonner clairement dans ce domaine
si on se mélange dans les concepts.

Accessoirement, je te rappelle qu'en Python *tout* est objet (même les
fonctions, les classes et les modules). Que l'objet soit un type
builtin avec une notation littérale ou une instance d'une classe que
tu a défini toi-même n'y change rien.


c'est marrant coder en python me parait plus naturel et facile que de
l'expliquer !!


Peut-être parce qu'en surface, Python est relativement simple ? Bon,
après, il y a la partie immergée de l'iceberg...

comment faire pour que http_server puisse utiliser des parametres
définis par ma classe 'principale' ?
En les lui passant ?



Je me disais qu'il y avait peut etre mieux que de passer le dico config
a chaque instance


Les solutions simples ont du bon. Entre autres, elles facilitent la
lisibilité et la testabilité.

sinon comment faire autrement ?


Impossible de répondre utilement sans connaissance de la classe
HttpServer, dont tu ne précises ni la provenance ni l'API.


HttpServer ce serait du ThreadedHttpServer, mais je pourrai aussi avoir
du JabberClient et d'autres classes diverses et variées qui auraient
besoin de partager les memes infos avec la classes 'mere'


Si j'ai bien compris, ta classe MonServeur sert de facade à plusieurs
services... Qui est client de MonServeur ? Et - hormis les histoires de
config - comment se passe la communication entre MonServeur et les
services qu'il "héberge" ?

Je crois que je m'exprime tres mal donc je reviens vers vous avec un
message mieux pensé.


Un autre intérêt d'essayer de formuler correctement un problème est que
ça permet souvent de se rendre compte que la solution est déjà là... !-)



Avatar
Boris Borcic
JB wrote:
Bonjour a tous...

Peut etre une question de newbie mais je n'ai pas reussi à trouver de
réponse, surement que j'utilise les mauvais termes...

Voila j'ai une classe A qui a comme attribut une classe B

class A:
def __init__(self):
self.valeur="test A"
self.b=B()
class B:
def __init__(self):
self.valeur="test B"

comment faire pour récupérer A.valeur directement depuis B ?

faut il forcement, lors de l'instanciation de B, indiquer un lien vers A
? (self.B.A = self par exemple)

ou y a t il un moyen plus classe de trouver la classe 'parente' de B
directement?

voila, je suis sur que Python propose une solution pythonesque pour ca ;)

merci a tous

a+

Julien


Bon, comme d'autres l'ont fait remarquer ta question ne distingue pas pro prement
(a) classes et instances, (b) sous-classes et membres. Comme ils ont rect ifié
dans le sens où ton intention porte sur les instances, je voudrais just e te
faire observer à toutes fins utiles qu'on peut aussi écrire

class B :
valeur = 'test B'

class A :
valeur = 'test A'
b = B

et accéder de n'importe où à A.valeur, B.valeur, A.b et A.b.valeur

de même, si

a = A()

alors

a.valeur == A.valeur
a.b == B

etc...

Avatar
JB

Bon, comme d'autres l'ont fait remarquer ta question ne distingue pas
proprement (a) classes et instances, (b) sous-classes et membres. Comme
ils ont rectifié dans le sens où ton intention porte sur les instances,
je voudrais juste te faire observer à toutes fins utiles qu'on peut
aussi écrire

class B :
valeur = 'test B'

class A :
valeur = 'test A'
b = B

et accéder de n'importe où à A.valeur, B.valeur, A.b et A.b.valeur


alors ce self.valeur dans la definition de classe ne sert à rien ?

class A:
def __init__(self):
self.valeur="test 1"
# ca equivaut à ???
valeur="test 1"

dans ce cas je me suis bien usé les doigts pour rien ;)

++

Julien

Avatar
JB
Si j'ai bien compris, ta classe MonServeur sert de facade à plusieurs
services... Qui est client de MonServeur ? Et - hormis les histoires de
config - comment se passe la communication entre MonServeur et les
services qu'il "héberge" ?


MonServeur gere un serveur HTTP, un client jabber et une lib pour gérer
des process (lancement, kill, surveillance...)
Ce script est executé sur une machine et je me connecte à distance sur
le http pour faire mes actions
La communication ? Justement, actuellement je passe au client jabber par
exemple une reference à MonServeur, donc dans JabberClient par exemple :

# (je suis en train de lire la PEP pour les new class styles)

class MonServeur:
def __init__(self):
self.http = HttpServer(self)
self.jabber = JabberClient(self)
def messageRecu(self):
print "io"

class JabberClient:
def __init__(self, MonServeur):
self.srv = MonServeur
def message(self):
self.srv.messageRecu()

ca me parait pas tres propre car JabberClient et HttpServer ont du coup
acces a tout MonServeur mais c'est le plus simple que j'ai trouvé pour
le moment...


Bonne soirée

Julien

Avatar
Bruno Desthuilliers

Si j'ai bien compris, ta classe MonServeur sert de facade à plusieurs
services... Qui est client de MonServeur ? Et - hormis les histoires
de config - comment se passe la communication entre MonServeur et les
services qu'il "héberge" ?



MonServeur gere un serveur HTTP, un client jabber et une lib pour gérer
des process (lancement, kill, surveillance...)
Ce script est executé sur une machine et je me connecte à distance sur
le http pour faire mes actions
La communication ? Justement, actuellement je passe au client jabber par
exemple une reference à MonServeur, donc dans JabberClient par exemple :

# (je suis en train de lire la PEP pour les new class styles)

class MonServeur:
def __init__(self):
self.http = HttpServer(self)
self.jabber = JabberClient(self)
def messageRecu(self):
print "io"

class JabberClient:
def __init__(self, MonServeur):
self.srv = MonServeur
def message(self):
self.srv.messageRecu()

ca me parait pas tres propre car JabberClient et HttpServer ont du coup
acces a tout MonServeur


Ca, en ce qui me concerne, ça ne pose pas de problème dans l'absolu. La
question que je me pose, par contre, c'est de savoir s'il est judicieux
d'assigner à un même objet des responsabilités "orthogonales" (en clair:
est-ce que la méthode messageRecu est utile à d'autres composants de ton
appli ? Sinon, elle n'est peut-être pas à sa place...)

mais c'est le plus simple que j'ai trouvé pour
le moment...


Mmm... Et tu a combien d'instances différentes de MonServeur ? Je pose
la question parce qu'à vu de nez, j'aurais tendance à penser qu'une
classe n'est pas forcément nécessaire... Les modules Python sont
naturellement des Singletons, donc un bon moyen de partager certaines
ressources entre plusieurs objets. Les classes ne sont utiles que quand
on a besoin de plusieurs instances simultanées gérant chacune leur état
propre.

Mais bon, tu connais ton projet mieux que moi (no comment) et je ne
doutes pas que tu ai déjà réfléchi à tous ça. Je ne peux donc te donner
que des "conseils" (hem) très généraux et pas forcément adaptés au
problème.


1 2 3