OVH Cloud OVH Cloud

Class

23 réponses
Avatar
Yves Lange
Je programme depuis quelque temps en Python mais je ne parviens toujours
pas à comprendre à koi sert une classe, comment les utilisés (même avec
mon bouquoi de oreilly) et comment les réutiliser ! Bref je recherche un
coup de main:
-class...
-_self, ça veut dire koi?
-_init_ c'est koi ?
-_main_ c'est koi ?
-_repr_ c'est koi ?
-_print_ ça marcherai ?
- Classe doit retourner quelque chose ?
- Vous aurez des exemples/exercices afin de crée des classes ? ça
pourrait servir à faire koi comme programme ?

Merci...

10 réponses

1 2 3
Avatar
bruno at modulix
Yves Lange wrote:
Je programme depuis quelque temps en Python mais je ne parviens toujours
pas à comprendre à koi sert une classe, comment les utilisés (même avec
mon bouquoi de oreilly) et comment les réutiliser ! Bref je recherche un
coup de main:


Ce n'est pas un cours de Python qu'il te faut, c'est une intro à la
programmation objet.

-class...
-_self, ça veut dire koi?


s/_self/self/ (pas d'underscore devant)

littéralement : "moi-même"

'self' est (par convention) le nom donné à la référence sur l'instance
courante dans une méthode.

-_init_ c'est koi ?


s/_init_/__init__/

Lequel ? le __init__.py d'un package, ou la methode __init__() d'une
classe ?

Enfin, dans les deux cas, il s'agit d'initialiser... Le fichier
__init__.py est ce qui fait d'un répertoire un package Python. Il peut
être vide, ou contenir du code d'initialisation du package.

La methode __init__ est l'initialisateur (improprement appelé
constructeur) d'une classe, c'est à dire la méthode qui est appelée lors
de l'instanciation d'un objet, et qui permet d'initialiser l'objet.

-_main_ c'est koi ?


Rien que je connaisse. Par contre, '__main__' (note les quotes) est la
valeur de la variable __name__ lor de l'exécution d'un script python -
c'est à dire quand le fichier .py est exécuté, par opposition au cas où
il est importé depuis un autre module, auquel cas __name__ est valorisé
avec le nom du module.

Dans la pratique, ça permet de savoir si un fichier donné est utilisé
comme programme principal ou comme module importé. Un idiome courant est:

def main(argv):
# point d'entrée du programme
(...)
return 0

if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))

-_repr_ c'est koi ?


__repr__ est la méthode appelée sur unObjet par la fonction
repr(unObjet). Elle est supposée retourner une représentation de cet objet?


-_print_ ça marcherai ?


Si tu lui mets des jambes.... (maman les ptis batos...)

- Classe doit retourner quelque chose ?


C'est quoi "Classe" ?

- Vous aurez des exemples/exercices afin de crée des classes ?


80% de la bibliothèque standard, à vue de nez.

ça
pourrait servir à faire koi comme programme ?


Tout. Une classe est un objet qui sert de "moule" pour créer d'autres
objets. Or en Python, *tout* est objet. Même les fonctions (si si). Tu
ne *peux pas* faire un programme Python sans manipuler des objets - qui
sont des instances de classes. Certaines de ces classes sont "builtins"
(chaines, dicts, listes, numériques, fonctions, modules etc), et il
existe des "raccourcis" syntaxiques pour les créer (ie : [] pour une
liste, "" pour une chaine, def ... pour une fonction etc) - mais on
pourrait (et on le fait parfois) les instancier explicitement. Pour le
reste, une classe sert à définir un type de donnée.

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Do Re Mi chel La Si Do
Bonjour !


Je suis sans doute tatillon, mais...

<mode_pédant>

à la programmation objet




Il vaudrait mieux parler de Programmation Orientée Objet (POO), car il y a
un risque de confusion. Python étant (ayant une structure) complètement
objet, même en programmation structurelle.

Et, même pire, il faudrait parler de Programmation Orientée Objet "à
classe", pour distinguer de la parler de Programmation Orientée Objet "à
prototype" (comme Self ou Lisaac).

</mode_pédant>


@-salutations

Michel Claveau



Avatar
bruno at modulix
Do Re Mi chel La Si Do wrote:
Bonjour !


Je suis sans doute tatillon, mais...

<mode_pédant>


Chouette, un autre pédant !-)

<mode="pédant">
Dis, Michel, tu es sûr que les caractères accentués sont acceptés comme
tag en XML ?-)
</mode>


à la programmation objet





Il vaudrait mieux parler de Programmation Orientée Objet (POO), car il y a
un risque de confusion. Python étant (ayant une structure) complètement
objet, même en programmation structurelle.

Et, même pire, il faudrait parler de Programmation Orientée Objet "à
classe", pour distinguer de la parler de Programmation Orientée Objet "à
prototype" (comme Self ou Lisaac).


<mode="encore plus pédant">
Les notions de classes ou de prototypes ne sont que des épiphénomènes,
rien de plus que deux approches possibles de la définition/construction
d'objets.
</mode>

BTW, vu la facilité avec laquelle on peut modifier une instance
spécifique d'un objet en Python, la distinction "classe/prototype" tend
à s'estomper.

Pour moi, un example de langage "class-based" - et non pas objet -, est
Java, qui impose que toute définition ait lieu dans une classe, mais
pour qui une classe, une fonction, ou même certains autres types
'primaires' ne *sont pas* des objets.

De ce point de vue, Python est bien un langage objet, même s'il permet
d'écrire des programmes entier sans utiliser l'instruction 'class'.
</mode_pédant>


@++


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"




Avatar
Do Re Mi chel La Si Do
Re


Tu as raison, en XML, les accents, dans les tags, ne passent pas. Mais je
n'ai pas précisé qu'il s'agissait de XML.
Peut-être était-ce du PML (Pédant Markup Language)...

Sinon, la programmation orientée objet basée à prototypes ont d'autres
détails (intriguants ?), comme la non-nécessité de déclarer un objet (ou une
classe) avant de l'utiliser (on peut même se passer des classes), ou comme
l'héritage dynamique (avec la possibilité de changer de parent, en cours
d'utilisation). Un peu comme si, en Python, on pouvait changer le type d'un
objet, sans perdre son contenu, et/ou définir des fonctions qui héritent.


@-salutations

Michel Claveau
Avatar
bruno at modulix
Do Re Mi chel La Si Do wrote:
Re


Tu as raison, en XML, les accents, dans les tags, ne passent pas. Mais je
n'ai pas précisé qu'il s'agissait de XML.
Peut-être était-ce du PML (Pédant Markup Language)...


Beau rétablissement !-)

Sinon, la programmation orientée objet basée à prototypes ont d'autres
détails (intriguants ?), comme la non-nécessité de déclarer un objet (ou une
classe) avant de l'utiliser (on peut même se passer des classes),


A vrai dire, le principe même des langages à prototype est qu'il n'y a
*pas* de classe. Du moins pas explicitement: une "classe" XXX est,
littéralement, l'ensemble des objets ayant la même interface.

ou comme
l'héritage dynamique (avec la possibilité de changer de parent, en cours
d'utilisation). Un peu comme si, en Python, on pouvait changer le type d'un
objet, sans perdre son contenu,


class Toto(object):
def __init__(self, name):
self.name = name
def hello(self):
return "hello from %s %s" % (self.__class__.__name__, self.name)

class Tata(object):
def hello(self):
raise "KESTATA ? TVEUMAFOTO ?"

t = Toto('toto')
t.hello()
t.__class__ = Tata
t.name
t.hello()


et/ou définir des fonctions qui héritent.


class ma_fonction(object):
def _helper(self):
print "in ma_fonction._helper"

def __call__(self):
print "in %s.__call__" % self.__class__.__name__
print "calling self._helper:"
self._helper()
print

class ma_fonction_bis(ma_fonction):
def _helper(self):
print "Hé, t'a vu, je suis pas le même !"

mf = ma_fonction()
mf()
mf.__class__ = ma_fonction_bis
mf()



--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Do Re Mi chel La Si Do
Bonsoir !

t.__class__ = Tata




Tout simplement.
Je n'avais même pas pensé à essayer.
Bravo.
C'est ce que j'appellerais une "horreur géniale".
J'aime.


Mais ça ne fonctionne pas toujours.
Par exemple :
a3
print a,a/2,a.__class__
a.__class__=float
print a,a/2,a.__class__


ou
class intnew(int):
def __init__(self,val):
self=val
class floatnew(float):
def __init__(self,val):
self=val

a=intnew(123)
print a,a/2,a.__class__
a.__class__=floatnew
print a,a/2,a.__class__


Mais, bon, le but de tout ça est plutôt douteux.


D'ailleurs, en testant divers trucs, j'ai eu des messages que je ne comprend
pas bien (car en anglais) :

TypeError: Error when calling the metaclass bases multiple bases
have instance lay-out conflict

TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases object, int



Avatar
bruno at modulix
Do Re Mi chel La Si Do wrote:
Bonsoir !


t.__class__ = Tata





Tout simplement.
Je n'avais même pas pensé à essayer.
Bravo.
C'est ce que j'appellerais une "horreur géniale".
J'aime.


Oui, Python permet une implémentation *très* littérale du pattern State !-)



Mais ça ne fonctionne pas toujours.


Non, bien sûr. Il y a des contraintes à satisfaire, et en l'occurrence
c'est à la charge du programmeur, le langage se contente de gueuler si
ça ne lui convient pas... On ne peut pas non plus tout avoir, n'est-ce
pas ?-)


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"




Avatar
Amaury
Bonsoir !



Bonsoir


t.__class__ = Tata
Tout simplement.





Eh oui, dans la plupart des cas, la classe n'est qu'un dictionnaire où
python va chercher les attributs et les fonctions qui ne sont pas
stockés avec l'objet lui-même. Changer la classe, c'est seulement
changer le chemin de recherche...

Mais ça ne fonctionne pas toujours.


Il faut que la structure en mémoire des objets soit "compatible".
Pour chaque objet, on prend la classe de base, celle qui est définie
dans le code source de python en C : c'est souvent 'object', ou même ''
(rien), et c'est parfois 'int' ou 'socket'. Cette classe de base définit
la structure en mémoire de l'objet. Pour changer la classe, il faut en
utiliser une autre qui ait la même structure !

D'ailleurs, en testant divers trucs, j'ai eu des messages que je ne comprend
pas bien (car en anglais) :

TypeError: Error when calling the metaclass bases multiple bases
have instance lay-out conflict

TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases object, int


ça veut dire à peu près :
"Erreur lors de l'appel aux méta-classes : les classes de base n'ont pas
de structure compatible".
"Erreur lors de l'appel aux méta-classes : impossible d'ordonner
correctement les classes de base (object, int)".

Ces erreurs se sont produites lors de la création d'une classe (avec
l'instruction "class xxx:"), ce qui explique la première phrase des
messages : python appelle une méta-classe chargée de construire la
classe (évident, non ?) (la métaclasse est souvent 'type')

La première erreur arrive lorsque les classes de base n'ont pas de
structure mémoire compatible. Comment allouer de la mémoire pour un
objet qui est à la fois un nombre et une socket ?
NB: 'object' et '' (rien) sont compatibles avec tout le monde, ce ne
sont que de simples dictionnaires à fonctions...

La seconde erreur est arrivée pendant la procédure qui établit la liste
des classes à consulter pour l'héritage des méthodes. Lorsqu'on dérive
de plusieurs classes, l'ordre devient compliqué à calculer. En gros, il
vaut mieux mettre la classe importante au début, et laisser les simples
objets à la fin.

Voilà, c'est un peu long et verbeux, mais ce n'est pas facile : en
Python, tout est objet, toute classe est elle-même un objet, et une
métaclasse est aussi une classe !

--
Amaury




Avatar
Yves Lange
Je programme depuis quelque temps en Python mais je ne parviens toujours
pas à comprendre à koi sert une classe, comment les utilisés (même avec
mon bouquoi de oreilly) et comment les réutiliser ! Bref je recherche un
coup de main:
-class...
-_self, ça veut dire koi?
-_init_ c'est koi ?
-_main_ c'est koi ?
-_repr_ c'est koi ?
-_print_ ça marcherai ?
- Classe doit retourner quelque chose ?
- Vous aurez des exemples/exercices afin de crée des classes ? ça
pourrait servir à faire koi comme programme ?

Merci...
Peut-on comparer des classes a un oeuf ? La coquille emballe tout le

système interne et propre a un oeuf !

Attention à la grippe aviaire ;)

Avatar
Do Re Mi chel La Si Do
Bonjour !

comparer une classe à un oeuf ?




Oui, si l'on admet que, grâce à une seringue, on peut injecter, dans le
jaune de l'oeuf, l'information permettant de transformer un oeuf de poule en
oeuf de crocodile.

Mais (voir l'autre branche du fil), on ne peut pas transformer l'oeuf de
poule en oeuf en chocolat, car on va obtenir le message : "TypeError: Error
when calling the metaclass bases multiple bases have instance lay-out
conflict".

CQFD sur les OGM, SGDG
(Ce Qu'il Fallait Démontrer sur les Oeufs Génétiquement Modifiés, Sans
Garantie Du Gouvernement).

@+

MCI



1 2 3