OVH Cloud OVH Cloud

Creer un type

4 réponses
Avatar
R12y
Bonjour,

J'ai, dans un programme, à alterner d'une certaine manière des "Jingles",
des "Clips" et des "Reportages".

Je dois donc composer une playlist contenant des Titres.
En raisonnant en "Objet", je crée donc une classe Titre

[...]
class Titre():
def __init__(self):
self.type= ????
self.duration=1
self.time_begin=0
[...]

Ca m'arrangerai de pouvoir faire quelquechose dans le genre:

[...]
t1=Titre()
t1.type=Jingle
[...]

Il n'y aurait qu'un nombre fini de valeurs possibles:

- Jingle
- Clip
- Reportage

J'aurais pu faire avec des entiers mais ça améliorerait la lisibilité du
code.

--

http://www.onirik.net/article.php3?id_article=817
http://www.maemo.org/platform/docs/howtos/howto_new_application.html
http://www.linuxdevices.com/files/article057/index.html

4 réponses

Avatar
cho7
J'aurais pu faire avec des entiers mais ça améliorerait la lisibilité du
code.



Mais pourquoi ne pas ecrire self.type="Jingle" alors ?
Ou alors créer 3 classes Jingle, Clip, et Reportage, heritant toutes les
3 de la meme classe, par exemple Media, et chacune dans sa methode
__init__ modifie self.type avec ce qui va bien ?


tu peux faire des methodes qui attendent un Media en parametre, et toi
de l'autre coté tu lui passe soit des Jingle(), soit des Clip(), etc.

C'est un peu plus objet à mon sens, ca permettra peut etre mieux de
coller aux evolutions futures de ton programme.

Avatar
Laurent Pointal
Bonjour,

J'ai, dans un programme, à alterner d'une certaine manière des "Jingles",
des "Clips" et des "Reportages".

Je dois donc composer une playlist contenant des Titres.
En raisonnant en "Objet", je crée donc une classe Titre

[...]
class Titre():
def __init__(self):
self.type= ????
self.duration=1
self.time_begin=0
[...]

Ca m'arrangerai de pouvoir faire quelquechose dans le genre:

[...]
t1=Titre()
t1.type=Jingle
[...]

Il n'y aurait qu'un nombre fini de valeurs possibles:

- Jingle
- Clip
- Reportage

J'aurais pu faire avec des entiers mais ça améliorerait la lisibilité du
code.



Ce lien pourrais éventuellement t'intéresser:
http://cheeseshop.python.org/pypi/enum/
http://groups.google.fr/group/comp.lang.python.announce/browse_thread/thread/6b96ecd506096557/4ef7b8c295ffa97d?lnk=st&q=python+enumeration+type+group%3Acomp.lang.python.announce&rnum=1&hl=fr#4ef7b8c295ffa97d

A+

Laurent.

Avatar
bruno at modulix
R12y wrote:
Bonjour,

J'ai, dans un programme, à alterner d'une certaine manière des "Jingles",
des "Clips" et des "Reportages".

Je dois donc composer une playlist contenant des Titres.
En raisonnant en "Objet", je crée donc une classe Titre

[...]
class Titre():
def __init__(self):
self.type= ????
self.duration=1
self.time_begin=0
[...]

Ca m'arrangerai de pouvoir faire quelquechose dans le genre:

[...]
t1=Titre()
t1.type=Jingle
[...]

Il n'y aurait qu'un nombre fini de valeurs possibles:

- Jingle
- Clip
- Reportage

J'aurais pu faire avec des entiers mais ça améliorerait la lisibilité du
code.



Bon bin tu a déjà eu deux réponses possibles: sous-classes et énums. Si
le 'type' sert à autre chose qu'à l'affichage (ie: comportement
différent etc), et qu'il y en a effectivement un nombre déterminé et pas
trop important, utilise plutôt la première solution. Si c'est uniquement
pour l'affichage (et éventuellement des filtres), et qu'il risque
d'apparaître un nombre indéterminé de nouveaux types, utilise plutôt la
seconde.


Note aussi qu'il y a une solution 'mixte': la composition (avec ou sans
délégation):

class TypeTitre(object):
def __init__(self):
if self.__class__ is TypeTitre:
raise NotImplementedError, "TypeTitre is an abstract base class"
def __str__(self):
return self.__class__.__name__

class Jingle(TypeTitre):
pass

class Clip(TypeTitre):
pass

class Reportage(TypeTitre):
pass

class Titre(object):
def __init__(self, typeClass, **kw):
self._type = typeClass()
# ...

type = property(fget=lambda self: return self._type)

# si les types déterminent des comportements, ajouter
# une délégation...
def __getattr__(self, name):
return getattr(self._type, name)

t1 = Titre(Jingle)
t2 = Titre(Clip)

etc...

Mes deux centimes...

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

Avatar
R12y
Laurent Pointal :
Il n'y aurait qu'un nombre fini de valeurs possibles:
- Jingle
- Clip
- Reportage
Ce lien pourrais éventuellement t'intéresser:



Merci. Effectivement, je ne sais pplus si c'est en Caml ou un Pascal, ça
s'appelait "type énuméré", quand on nous l'a appris.

--

http://www.onirik.net/article.php3?id_article7
http://www.maemo.org/platform/docs/howtos/howto_new_application.html
http://www.linuxdevices.com/files/article057/index.html