Re: Modificacar en tiempo de ejecución __bases__

Milton Galo Patricio Inostroza Aguilera minoztro en gmail.com
Mie Jun 11 23:45:30 CEST 2008


El día 10 de junio de 2008 12:35, Milton Galo Patricio Inostroza
Aguilera <minoztro en gmail.com> escribió:
> Estimados:
>
>  Por alguna extraña razón necesito modificar el __bases__ de una
> clase para agregarle una herencia que necesito que tengan mis clases
> "obligatoriamente"  evitando que el programador tenga que
> escribirla...he tratado lo siguiente sin éxito:

Bueno después de ser tratado como demente en el canal de python, me
puse a pensar profundamente que es lo que realmente necesitaba :-) y
bueno en realidad no necesito modificar __bases__ (aunque no se si se
pueda eso), sólo tengo que agregar un método en tiempo de ejecución a
la clase (leí algo sobre Mix-In).

Al final el código que sirve y funciona quedó de la siguiente manera:

def implementacion(clase):
    theClassDict = sys._getframe().f_back.f_locals
    print clase.__dict__
    theClassDict.update({'__getattribute__':clase.__dict__['__getattribute__']})
    return

class foo(object):
    def method(self):
        self.a = 10
        print self.a
        print self.z

    def __getattribute__(self, aKey):
        v = object.__getattribute__(self, aKey)
        print 'yuju'
        return v

class bar(object):
    def __init__(self):
        self.z = 20
    def algo(self):
        print self.z
    implementacion(foo)


if __name__ == '__main__':
    Foo = foo()
    Bar = bar()
    print bar.__dict__
    Bar.algo()
    Bar.g = 100
    print Bar.g


Igual sería bueno que me den sus impresiones de esto..yo lo veo un
poco "sucio" pero me sirve!, saludos
>
>>>> class test(object):
> ...     pass
> ...
>>>> a = test()
>>>> a.__class__.__bases__
> (<type 'object'>,)
>
> A simple vista veo que es una tupla incluso si hago:
>
>>>> type(a.__class__.__bases__)
> <type 'tuple'>
>
> Confirmo "aparentemente" mi pensamiento, sigo y creo una nueva clase
> que hereda de test
>
>>>> class test2(test):
> ...     pass
> ...
>>>> a = test2()
>>>> a.__class__.__bases__
> (<class '__main__.test'>,)
>
> Creo una nueva clase test3 para usarla después
>
>>>> class test3(object):
> ...     pass
> ...
>>>>
>
> Bueno quedándome conforme con esto ahora quiero que test3 herede
> también de test2 hago lo siguiente:
>
>>>> c = test3()
>>>> c.__class__.__bases__
> (<type 'object'>,)
>>>> c.__class__.__bases__ = (c.__class__.__bases__[0],test2)
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> TypeError: Cannot create a consistent method resolution
> order (MRO) for bases object, test2
>
> He leído el MRO pero no doy como hacer para que funcione esto incluso
> intenté que solo test3 heredara de test2 así:
>
>>>> c.__class__.__bases__ = (test2,)
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> TypeError: __bases__ assignment: 'test2' deallocator differs from 'object'
>
> y bueno me imagino que es porque directamente estoy tratando que la
> clase ya no herede de object en una forma "sucia".
>
> Qué estoy haciendo mal?....que debo leer o re-leer para entender bien
> esto....es indispensable poder hacer esto ya que lo que heredarán las
> clases del programador es una clase que describe un descriptor
> {__getattribute__, __setattr__, etc}, saludos
>
> --
> Milton Inostroza Aguilera
>



-- 
Milton Inostroza Aguilera
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


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