Muchas gracias !!
El 12 de diciembre de 2011 20:29, Anler Hernandez Peral <[email protected]>escribió: > Hola Jose > > El problema está en que al crear una instancia de tu clase: > > instance = MyClass_1('x', 'y') > > se están ejecutando los métodos __init__ de cada clase de la jerarquía en > un cierto orden (esto se llama method resolution order o mro), dicho orden > lo puedes ver para MyClass_1 de la siguiente forma: > > MyClass_1.mro() > > lo cual a mi me da como resultado: > > [<class '__main__.MyClass_1'>, <class 'threading.Thread'>, <class > 'threading._Verbose'>, <class '__main__.Local_Interface_1'>, <class > '__main__.Global_Interface'>, <type 'object'>] > > > que significa esto? que el primer __init__ que se buscara será el de > MyClass_1, y luego el threading.Thread, etc, entonces, al no tener __init__ > MyClass_1, se invoca el de threading.Thread pasandole los argumentos 'x', > 'y' que pasamos al crear nuestra instancia y justamente aqui es donde falla > porque Thread se queja sobre el primer parametro de posicion que debe ser > None > > Solucion: simplemente debes definir correctamente tu herencia para que se > ejecuten las inicializaciones en el orden que desees: > > cambia > > class MyClass_1(threading.Thread, Local_Interface_1): > > por > > class MyClass_1(Local_Interface_1, threading.Thread): > > de esta forma el mro quedara asi: > > [<class '__main__.MyClass_1'>, <class '__main__.Local_Interface_1'>, > <class '__main__.Global_Interface'>, <class 'threading.Thread'>, <class > 'threading._Verbose'>, <type 'object'>] > > > -- > anler > > > 2011/12/13 Jose Caballero <[email protected]> > >> Hola, >> >> >> >> por una seria de razones (llamémosle exigencias del guión"), tenga una >> jerarquía de clases heredadas unas de otras. >> Una version simplificada del código es [1]. >> >> -- Necesito que la clase con la que voy a trabajar, MyClass_1, sea un >> "singleton" y a la vez un "thread". >> >> -- Al mismo tiempo esa clase debe tener una interfaz que se define en >> Local_Interface_1 >> >> -- Y es importante que se sepa si los objetos de esa clase son creados de >> forma adecuada o no. >> Para asegurarme de ello, he intentado que la clase "madre de todas las >> clases", Globa_Interface, >> obligue a la implementación de un método initialize() y en su __init__() >> se comprueba si un atributo self.valid es True o False. >> >> >> Obtengo este error [2]. >> Por lo que he podido "debuggear" parece ser que con esta jerarquía de >> clases la línea threading.Thread.__init__(self) nunca llega a ejecutarse. >> ¿Alguna idea de la razón? >> >> >> >> Muchas gracias por adelantado. Cualquier comentario será bienvenido. >> Jose >> >> >> ===================================================== >> [1] >> >> class Singleton(type): >> def __init__(cls, name, bases, dct): >> cls.__instance = None >> type.__init__(cls, name, bases, dct) >> def __call__(cls, *args, **kw): >> if cls.__instance is None: >> cls.__instance = type.__call__(cls, *args,**kw) >> return cls.__instance >> >> >> --------------------------------------------------------------------------------------------------- >> >> class Global_Interface(object): >> def __init__(self, *k, **kw): >> self.valid = True >> try: >> self.initialize(*k, **kw) >> except: >> self.valid = False >> >> def initialize(self, *k, **kw): >> raise NotImplementedError >> >> >> --------------------------------------------------------------------------------------------------- >> >> class Local_Interface_1(Global_Interface): >> def f(self): >> raise NotImplementedError >> >> >> class Local_Interface_2(Global_Interface): >> def g(self): >> raise NotImplementedError >> >> >> --------------------------------------------------------------------------------------------------- >> >> class MyClass_1(threading.Thread, Local_Interface_1): >> __metaclass__ = Singleton >> def initialize(self, x, y): >> threading.Thread.__init__(self) >> self.x = x >> self.y = y >> >> ... otras operaciones de inicializacion... >> >> self.valid = True >> >> def f(self): >> ... blah blah ... >> >> >> ===================================================== >> [2] >> >> File "/usr/lib64/python2.4/threading.py", line 378, in __init__ >> assert group is None, "group argument must be None for now" >> AssertionError: group argument must be None for now >> >> >> _______________________________________________ >> Python-es mailing list >> [email protected] >> http://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > _______________________________________________ > Python-es mailing list > [email protected] > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > >
_______________________________________________ Python-es mailing list [email protected] http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
