Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1293 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Différence entre membre dans et hors __init__ [RESOLU]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Différence entre membre dans et hors __init__ [RESOLU]

n°1596912
Sve@r
Posté le 07-08-2007 à 19:28:44  profilanswer
 

Bonjour,
 
Je suis un débutant en Python mais j'ai commencé à développer qq applis. Et là, je me trouve devans une interrogation
Quelle est la différence entre ces deux écritures de membre d'une classe
 

Code :
  1. class toto:
  2.    def __init__(self):
  3.         self.total=100
  4.  
  5. var=toto()
  6. print var.total


 

Code :
  1. class toto:
  2.    total=100
  3.    def __init__(self):
  4.         return
  5.  
  6. var=toto()
  7. print var.total


 
En vous remerciant


Message édité par Sve@r le 09-08-2007 à 14:40:01

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
mood
Publicité
Posté le 07-08-2007 à 19:28:44  profilanswer
 

n°1596924
c0wb0y
:d
Posté le 07-08-2007 à 20:01:49  profilanswer
 

Code :
  1. >>> class toto:
  2. def __init__(self):
  3.  self.total=100
  4. >>> toto.total
  5. Traceback (most recent call last):
  6.   File "<pyshell#10>", line 1, in -toplevel-
  7.     toto.total
  8. AttributeError: class toto has no attribute 'total'
  9. >>>
  10. >>> class toto:
  11. total=100
  12. def __init__(self):
  13.  return
  14. >>> toto.total
  15. 100
  16. >>>
 

Avec la première solution, total est une variable d'instance*, elle n'est accessible que si tu créé une instance de cette classe.
L'autre solution, c'est une variable de classe*, tu peux l'utiliser sans avoir à instancier un objet toto (cf mon exemple ci dessus).

 

*Le vocabulaire peut être maladroit, je sais que souvent les gens sont pas d'accord sur ces termes :/

Message cité 1 fois
Message édité par c0wb0y le 07-08-2007 à 20:03:45
n°1596972
Sve@r
Posté le 07-08-2007 à 23:32:30  profilanswer
 

c0wb0y a écrit :

Code :
  1. >>> class toto:
  2. def __init__(self):
  3.  self.total=100
  4. >>> toto.total
  5. Traceback (most recent call last):
  6.   File "<pyshell#10>", line 1, in -toplevel-
  7.     toto.total
  8. AttributeError: class toto has no attribute 'total'
  9. >>>
  10. >>> class toto:
  11. total=100
  12. def __init__(self):
  13.  return
  14. >>> toto.total
  15. 100
  16. >>>


 
Avec la première solution, total est une variable d'instance*, elle n'est accessible que si tu créé une instance de cette classe.
L'autre solution, c'est une variable de classe*, tu peux l'utiliser sans avoir à instancier un objet toto (cf mon exemple ci dessus).
 
*Le vocabulaire peut être maladroit, je sais que souvent les gens sont pas d'accord sur ces termes :/


 
J'ai compris. Dans le 2° cas, c'est grosso-modo comme une variable statique de classe. J'ai compris merci.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1597062
masklinn
í dag viðrar vel til loftárása
Posté le 08-08-2007 à 10:32:13  profilanswer
 

Sve@r a écrit :

 

J'ai compris. Dans le 2° cas, c'est grosso-modo comme une variable statique de classe. J'ai compris merci.


C'est exactement ça, ça correspond à une static en Java.

 

BTW c0wb0y quand tu veux créer une méthode vide, ne pas utiliser return, utiliser "pass" genre

Code :
  1. class Foo(object):
  2.    def __init__(self):
  3.        pass


et accessoirement, tu n'est pas obligé de définir __init__ (il y a un constructeur vide avec arity 1 par défaut), donc pour ton 2e cas tu pouvais écrire directement

Code :
  1. class Toto:
  2.    total=100


;)

Message cité 1 fois
Message édité par masklinn le 08-08-2007 à 10:34:09

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1597442
c0wb0y
:d
Posté le 08-08-2007 à 20:34:50  profilanswer
 

Masklin: En fait j'ai juste copier/coller le code de Sve@r dans IDLE :D
 
Mais merci des infos, je ne connais pas spécialement bien python (j'ai plus l'impression de programmer "en Django" qu'en Python en bossant avec ce framework (kilébien  :ange: )).

n°1597516
Sve@r
Posté le 09-08-2007 à 01:31:32  profilanswer
 

masklinn a écrit :


C'est exactement ça, ça correspond à une static en Java.
 
BTW c0wb0y quand tu veux créer une méthode vide, ne pas utiliser return, utiliser "pass" genre

Code :
  1. class Foo(object):
  2.    def __init__(self):
  3.        pass




 
Ah !!! J'avais déjà vu "pass" dans un "try... except" et j'avais compris qu'il s'agissait grosso-modo d'une commande neutre style "il faut une commande pour que la syntaxe soit correcte mais je veux rien faire donc je mets pass"
ex:

Code :
  1. if machin:
  2.    pass
  3. else:
  4.    truc à faire si machin est faux
  5. suite...


 
Bien entendu, on peut simplifier en mettant "if not machin" mais on a le même truc en Bourne Shell

Code :
  1. if commande
  2. then
  3.    true
  4. else
  5.    truc à faire si commande renvoie faux
  6. fi


Et comme en Bourne Shell on peut pas faire "if not", on est bien obligé d'en passer par là
 
Donc quand j'ai tapé mon exemple, j'ai failli en effet mettre "pass" mais j'ai choisi return...
 

masklinn a écrit :

et accessoirement, tu n'est pas obligé de définir __init__ (il y a un constructeur vide avec arity 1 par défaut)


ouaip, ça je savais mais bon, comme je débute et que je voulais une comparaison entre 2 codes, j'ai essayé de rendre les 2 codes aussi semblables que possibles pour que seules les différences concernant ma question en ressortent mieux  ;)

Message cité 1 fois
Message édité par Sve@r le 16-08-2007 à 15:45:40

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1597544
masklinn
í dag viðrar vel til loftárása
Posté le 09-08-2007 à 09:15:30  profilanswer
 

Sve@r a écrit :


 
Ah !!! J'avais déjà vu "pass" dans un "try... except" et j'avais compris qu'il s'agissait grosso-modo d'une commande neutre style "il faut une commande pour que la syntaxe soit correcte mais je veux rien faire donc je mets pass"


C'est exactement ça, Python requiert au moins un "statement" (n'importe quelle expression python) au sein d'un bloc (if, elif, else, try, except, finally, while, for, with, def, class) et un commentaire ou une ligne vide n'est pas un statement, donc on a "pass" qui est le "null statement".
 
Cf http://docs.python.org/ref/pass.html pour la doc officielle.
 
Que je recommande de lire, accessoirement, c'est comme ça que j'ai appris qu'on pouvait écrire

Code :
  1. while foo:
  2.    doSomething()
  3. else:
  4.    doSomethingElse()


ou

Code :
  1. for foo in bar:
  2.    foo.doSomething()
  3. else:
  4.    pouet()


;)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1597545
masklinn
í dag viðrar vel til loftárása
Posté le 09-08-2007 à 09:17:23  profilanswer
 

Accessoirement, le forum est capable de coloriser les langages, il suffit de remplacer une balise [code] normale par une balise [code=nomdulangage], genre [code=python], [code=ruby], etc...


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1597572
Sve@r
Posté le 09-08-2007 à 10:32:25  profilanswer
 

masklinn a écrit :

c'est comme ça que j'ai appris qu'on pouvait écrire

Code :
  1. while foo:
  2.    doSomething()
  3. else:
  4.    doSomethingElse()


ou

Code :
  1. for foo in bar:
  2.    foo.doSomething()
  3. else:
  4.    pouet()


;)


 
Ouaip. Je viens de regarder les boucles. J'ai même tapé un truc sur idle

Code :
  1. for i in range(5):
  2.    print i
  3. else:
  4.    print i, "fin"


 
Ben je vois pas la différence avec la même boucle sans le else

Code :
  1. for i in range(5):
  2.    print i
  3. print i, "fin"


 

masklinn a écrit :

Accessoirement, le forum est capable de coloriser les langages, il suffit de remplacer une balise [code] normale par une balise [code=nomdulangage], genre [code=python], [code=ruby], etc...


J'ai réédité tous mes posts précédents. Mais il connait pas [code=shell]  :ange:  
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1599734
multani
Dépressionnisé
Posté le 15-08-2007 à 12:01:07  profilanswer
 

Sve@r a écrit :


Ouaip. Je viens de regarder les boucles. J'ai même tapé un truc sur idle

Code :
  1. for i in range(5):
  2.    print i
  3. else:
  4.    print i, "fin"


 
Ben je vois pas la différence avec la même boucle sans le else

Code :
  1. for i in range(5):
  2.    print i
  3. print i, "fin"




 
Tiré de la doc :

Citation :


A break statement executed in the first suite terminates the loop without executing the else clause's suite.


 
Donc, un break dans la boucle n'exécute pas le else.
 
(Merci Masklinn de m'avoir fait découvrir le else: après les boucles :jap: )

mood
Publicité
Posté le 15-08-2007 à 12:01:07  profilanswer
 

n°1599746
Sve@r
Posté le 15-08-2007 à 12:19:51  profilanswer
 

multani a écrit :

Tiré de la doc :

Citation :


A break statement executed in the first suite terminates the loop without executing the else clause's suite.


 
Donc, un break dans la boucle n'exécute pas le else.


Ah oui, c'est assez subtil. Ptet que le jour viendra où j'aurai besoin de ce type de comportement mais là...
 

multani a écrit :

(Merci Masklinn de m'avoir fait découvrir le else: après les boucles :jap: )


Idem  :sol:  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1599747
masklinn
í dag viðrar vel til loftárása
Posté le 15-08-2007 à 12:20:30  profilanswer
 

Sve@r a écrit :


J'ai réédité tous mes posts précédents. Mais il connait pas code=shell  :ange:  
 


Il connait code=bash par contre :o
 

Code :
  1. if commande then
  2.   true
  3. else
  4.   truc à faire si commande renvoie faux
  5. fi


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Différence entre membre dans et hors __init__ [RESOLU]

 

Sujets relatifs
Résolu - Arrayliste, exemple COMPLET[résolu] CSS zoom limité à 30 images ?
Tri de réponses chiffre/caractère [resolu][Résolu][MYSQL] lister les doublons + rapidement
RésoluTrigger sur la base et non sur une table [resolu]
[Résolu] Problème avec les variables de sessionDifférence d'interpretation IE/firefox sur blog
[Résolu] Erreur AJAX 
Plus de sujets relatifs à : Différence entre membre dans et hors __init__ [RESOLU]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR