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

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

Marsh Posté le 07-08-2007 à 19:28:44    

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.
Reply

Marsh Posté le 07-08-2007 à 19:28:44   

Reply

Marsh Posté le 07-08-2007 à 20:01:49    

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
Reply

Marsh Posté le 07-08-2007 à 23:32:30    

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.
Reply

Marsh Posté le 08-08-2007 à 10:32:13    

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
Reply

Marsh Posté le 08-08-2007 à 20:34:50    

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: )).

Reply

Marsh Posté le 09-08-2007 à 01:31:32    

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.
Reply

Marsh Posté le 09-08-2007 à 09:15:30    

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
Reply

Marsh Posté le 09-08-2007 à 09:17:23    

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
Reply

Marsh Posté le 09-08-2007 à 10:32:25    

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.
Reply

Marsh Posté le 15-08-2007 à 12:01:07    

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: )

Reply

Marsh Posté le 15-08-2007 à 12:01:07   

Reply

Marsh Posté le 15-08-2007 à 12:19:51    

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.
Reply

Marsh Posté le 15-08-2007 à 12:20:30    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed