tiens je suis tombé sur un article qui tombe à pic :
http://sametmax.com/mais-qui-donc-herite-de-ma-classe/
Je me suis dit que ça pourrait intéresser quelques geeks de savoir comment
lister les enfants d'une classe, récursivement.Pas une question que l'on se
pose souvent, à moins d'avoir une lib qui expose une classe avec beaucoup
d'introspection.
Ceci dit pour la culture G, je me suis dit que ça pourrait intéresser quelques
geeks de savoir comment lister les enfants d'une classe, récursivement.
def subclasses(cls, _found=()):
""" Retourne toutes les classes héritant d'une classe """
# On check que la classe est hérite bien de "object".
# Utile uniquement pour un code 2.x qui utiliserait
# des old style classes, qui n'ont pas "__subclasses__".
if not isinstance(cls, type):
raise TypeError('subclasses works only with new-style classes'
', not %s' % cls)
# On va stocker les classes rencontrées dans un set
# pour éviter les doublons car on peut tomber sur
# un héritage en forme de diamant.
_found = _found or set()
try:
subs = cls.__subclasses__()
except TypeError: # Erreur levée si cls == type, petits vicieux
subs = cls.__subclasses__(cls)
for sub in subs:
if sub not in _found:
_found.add(sub)
# Un appel récursif comme on les aimes
subclasses(sub, _found)
return _found
Pas très compliqué, donc, si on connait les piègeounets : ça ne marche pas sur
les old syle classes, et il y a un traitement spécial pour type. Celà dit, qui
utilise encore des old styles classes ? Et franchement lister les héritiers de
type, à par pour satisfaire sa curiosité.
Aller, juste pour le fun, sur un virtualenv vierge:
for x in subclasses(object):
print x
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
Putain, ça c'est du remplissage ! 20minutes serait fier de moi.
(Image= flattr this!)
Mais qui donc hérite de ma classe ?
----- Original Message -----
From: yannick
To: [email protected]
Sent: Friday, June 20, 2014 4:25 PM
Subject: [progliste] reponse à Paul ZikiTranslator
bjr, désolé, impossible d'nvoyer un mail sur script NVDA, et vu que c'est
toujours de la prog, je l'envoie ici .
je ne pige pas quand je fais répondre, le mail n'arrive pas .... troisième
essaie .
revoici le mail :
bjr,
oui je proposait un module complémentaire ,
au début j'avais envoyé un fichier nvda-addon, et comme tu as fait remarqué
que l'archive était endommagé, j'ai fait la facilité en envoyant le fichier
py .
ci dessous je mets le nvda-addon , avec drop box cela ira mieux je pense .
je l'ai testé et tout fonctionnne .
quand j'envoie sur les listes je rajoute l'extension txt par habitude .
j'ai donc envoyé 2 fichier, le module et le py pour éviter des pb dû à
l'envoie sur l'internet .
quand aux gui.wx &appModuleHandler.api etc ..
certes je me fatigue beaucoup pour éviter des importations multiples,
je pourrais me faciliter la vie en important juste les modules utiles afin
d'éviter des lignes à rallonge, mais je le fais ainsi en guise
d'apprentissage .
bien entendu que le script fonctionnne , certes
controlTypes.ROLE_BUTTON est plus simple à écrire que :
appModuleHandler.api.controlTypes.ROLE_BUTTON
mais bon, j'ai juste voulu faire un choix de courageux .
Tout fonctionnne, il faut juste comprendre pourquoi quand je fais insert +h,
c'est à dir ton script, la touche control+space n'apparait pas .
je n'ai pas testé control +space dans d'autre script , mais je suppose qu'il
n'apparaitra pas non plus .
https://dl.dropboxusercontent.com/u/5497034/envoie/ZikiTranslator.nvda-addon