[Python-es] problema con __init__() en clase heredada, entre otras cosas, de threading.Thread

Jose Caballero jcaballero.hep en gmail.com
Mar Dic 13 02:56:09 CET 2011


Muchas gracias !!



El 12 de diciembre de 2011 20:29, Anler Hernandez Peral
<anler86 en gmail.com>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 <jcaballero.hep en gmail.com>
>
>> 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
>> Python-es en python.org
>> http://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20111212/3446fd96/attachment.html>


Más información sobre la lista de distribución Python-es