Muchas gracias !!<br><br><br><br><div class="gmail_quote">El 12 de diciembre de 2011 20:29, Anler Hernandez Peral <span dir="ltr"><<a href="mailto:anler86@gmail.com">anler86@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hola Jose<div><br></div><div>El problema está en que al crear una instancia de tu clase: </div><div><br></div><div>instance = MyClass_1('x', 'y') </div><div><br></div><div>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:</div>
<div><br></div><div>MyClass_1.mro()</div><div><br></div><div>lo cual a mi me da como resultado:</div><div><br></div><div>
<p>[<class '__main__.MyClass_1'>, <class 'threading.Thread'>, <class 'threading._Verbose'>, <class '__main__.Local_Interface_1'>, <class '__main__.Global_Interface'>, <type 'object'>]</p>
<p><br></p><p>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</p>
<p>Solucion: simplemente debes definir correctamente tu herencia para que se ejecuten las inicializaciones en el orden que desees:</p><p>cambia</p><p>class MyClass_1(threading.Thread, Local_Interface_1):</p>
<p>por</p><p>class MyClass_1(Local_Interface_1, threading.Thread):</p><p>de esta forma el mro quedara asi:</p><p>
</p><p>[<class '__main__.MyClass_1'>, <class '__main__.Local_Interface_1'>, <class '__main__.Global_Interface'>, <class 'threading.Thread'>, <class 'threading._Verbose'>, <type 'object'>]</p>
<p><br></p><p></p>--<br>anler<br>
<br><br><div class="gmail_quote">2011/12/13 Jose Caballero <span dir="ltr"><<a href="mailto:jcaballero.hep@gmail.com" target="_blank">jcaballero.hep@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div></div><div class="h5">
Hola, <br><br><br><br>por una seria de razones (llamémosle exigencias del guión"), tenga una jerarquía de clases heredadas unas de otras.<br>Una version simplificada del código es [1].<br><br>-- Necesito que la clase con la que voy a trabajar, MyClass_1, sea un "singleton" y a la vez un "thread".<br>
<br>-- Al mismo tiempo esa clase debe tener una interfaz que se define en Local_Interface_1<br><br>-- Y es importante que se sepa si los objetos de esa clase son creados de forma adecuada o no. <br>Para asegurarme de ello, he intentado que la clase "madre de todas las clases", Globa_Interface, <br>
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.<br><br><br>Obtengo este error [2].<br>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. <br>
¿Alguna idea de la razón?<br><br><br><br>Muchas gracias por adelantado. Cualquier comentario será bienvenido.<br>Jose<br><br><br>=====================================================<br>[1]<br><br>class Singleton(type):<br>
def __init__(cls, name, bases, dct):<br> cls.__instance = None<br> type.__init__(cls, name, bases, dct)<br> def __call__(cls, *args, **kw):<br> if cls.__instance is None:<br> cls.__instance = type.__call__(cls, *args,**kw)<br>
return cls.__instance<br><br>---------------------------------------------------------------------------------------------------<br><br>class Global_Interface(object):<br> def __init__(self, *k, **kw):<br> self.valid = True<br>
try:<br> self.initialize(*k, **kw)<br> except:<br> self.valid = False<br><br> def initialize(self, *k, **kw):<br> raise NotImplementedError<br><br>---------------------------------------------------------------------------------------------------<br>
<br>class Local_Interface_1(Global_Interface):<br> def f(self):<br> raise NotImplementedError<br><br><br>class Local_Interface_2(Global_Interface):<br> def g(self):<br> raise NotImplementedError<br><br>
---------------------------------------------------------------------------------------------------<br><br>class MyClass_1(threading.Thread, Local_Interface_1):<br> __metaclass__ = Singleton<br> def initialize(self, x, y):<br>
threading.Thread.__init__(self)<br> self.x = x<br> self.y = y<br><br> ... otras operaciones de inicializacion...<br><br> self.valid = True<br><br> def f(self):<br> ... blah blah ...<br>
<br><br>=====================================================<br>[2]<br><br> File "/usr/lib64/python2.4/threading.py", line 378, in __init__<br> assert group is None, "group argument must be None for now"<br>
AssertionError: group argument must be None for now<br><br>
<br></div></div>_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-es" target="_blank">http://mail.python.org/mailman/listinfo/python-es</a><br>
FAQ: <a href="http://python-es-faq.wikidot.com/" target="_blank">http://python-es-faq.wikidot.com/</a><br>
<br></blockquote></div><br></div>
<br>_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org">Python-es@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-es" target="_blank">http://mail.python.org/mailman/listinfo/python-es</a><br>
FAQ: <a href="http://python-es-faq.wikidot.com/" target="_blank">http://python-es-faq.wikidot.com/</a><br>
<br></blockquote></div><br>