On 8/23/13, Chema Cortes <pych...@gmail.com> wrote: > El día 22 de agosto de 2013 02:59, Juan BC <jbc.deve...@gmail.com> > escribió: >> Estoy haciendo un pequeño script que recibe otro script por parametro >> (osea un plugin) y lo que necesito es ordenar las clases dentro de el >> plugin en el orden que fueron declaradas: >> >> en un ejemplo trivial seria algo asi: >> >> # plugin.py >> >> class B(object): pass >> class A(object): pass >> >> # manager.py >> >> import plugin >> >> classes = [k, v for k,v in vars(plugin).items()] >> classes.sort(<CODIGO PARA ORDENAR B antes que A>) > > No es buena idea ésto que quieres hacer. Por ejemplo, ¿dónde dirías > que se "declaran" las clases si hago ésto?: > > from plugin import * > > ¿Y si me da por hacer cosas como estas? > > class A: pass > > B = A > > class A: pass > > Hay dos clases, pero en verdad he redeclarado 'A'. > > Por lo que parece, estás creando una especie de API para creación de > plugins y te gustaría obtener el orden de los plugins tal y como son > declarados. Una solución sería usando metaclases tal como te ha > sugerido Olemis Lang. Pero las metaclases son algo complejas de > manejar y es posible evitar su uso en muchos casos desde que existen > los decoradores de clase. >
La elección entre meta-clases y decoradores de clases , en este caso , puede ser a gusto de la persona en cuestión . De hecho en teoría Trac podría facilitar las dos variantes : - metaclases para el sistema d plugins ComponentMeta (Component + ComponentManager) - decoradores de clases para declara las interfaces q implementa una clase (i.e. implements) Nótese que en este caso la diferencia entre las dos variantes consiste en expresar intrínsecamente el comportamiento esperado de las clases (registrarse en orden en el cache global, añadir el comportamiento esperado del sistema d plugins e.g. implement ParametricSingleton pattern per ComponentManager, etc ...) vs el comportamiento específico d una clase en cuestión (registrarse en orden en el cache de la interface específica ...) Como se puede ver no son conceptos equivalentes . Las meta-clases participan en herencia , añaden comportamientos a los meta-objetos q representan las clases (clases) y sus instancias (objetos) ; además son tipos . Los decoradores son modificadores más puntuales ... quizás parecidos a la situación descriptores vs __getattr__ El hecho de poner __metaclass__ en el cuerpo de la clase se puede solucionar haciendo la asignación en una clase base (e.g. trac.core.Component) y ya no es necesario repetirlo en las sub-clases . De hecho , en Trac + Bloodhound el hecho d tener ComponentMeta y todo el modelo meta es transparente ... [...] -- Regards, Olemis - @olemislc Apache™ Bloodhound contributor http://issues.apache.org/bloodhound http://blood-hound.net Blog ES: http://simelo-es.blogspot.com/ Blog EN: http://simelo-en.blogspot.com/ Featured article: _______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/