2011-06-24 23 views
5

La opción -builtin de SWIG tiene la ventaja de ser más rápida y de estar exento de un error con herencia múltiple.
El inconveniente es que no puedo fijar cualquier atributo en las clases generadas o cualquier subclase:
-I puede extender una pitón tipo interno como lista, sin problemas, creando una subclase que:Extendiendo clases integradas de SWIG

class Thing(list): 
    pass 

Thing.myattr = 'anything' # No problem 

-Sin embargo el uso el mismo enfoque en un tipo SWIL incorporado, sucede lo siguiente:

class Thing(SWIGBuiltinClass): 
    pass 

Thing.myattr = 'anything' 

AttributeError: type object 'Thing' has no attribute 'myattr' 

¿Cómo puedo evitar este problema?

+0

Creo que hay que señalar que la solución de los monjes a este problema es totalmente adecuado, pero es probable que niega todos los beneficios del uso de '-builtin' en el primer lugar . Por supuesto, en mi caso, tengo una clase que necesita la velocidad, que no subclases; pero también tengo otra clase que hago subclase. Entonces es una técnica realmente útil. – Mike

Respuesta

3

Encontré una solución por accidente. Estaba experimentando con metaclasses, pensando que podía anular las funciones setattr y getattr del tipo incorporado en la subclase.

Al hacer esto, descubrí que los editores ya tienen una metaclase (SwigPyObjectType), por lo que mi metaclase tuvo que heredarla.

Y eso es todo. Esto solo solucionó el problema. Estaría alegre si alguien podría explicar por qué:

SwigPyObjectType = type(SWIGBuiltinClass) 

class Meta(SwigPyObjectType): 
    pass 

class Thing(SWIGBuiltinClass): 
    __metaclass__ = Meta 

Thing.myattr = 'anything' # Works fine this time