2012-05-05 8 views
8

Quiero comprobar si un objeto es una instancia de una clase en una lista/grupo de clases, pero no puedo encontrar si hay incluso una manera Pythonic de hacerlo sin hacer¿Cómo comparar la herencia con varias clases?

if isinstance(obj, Class1) or isinstance(obj, Class2) ... or isinstance(obj, ClassN): 
    # proceed with some logic 

me refiero , comparando clase por clase.

Sería más probable usar alguna función similar a isinstance que recibiría n cantidad de Clases para comparar si eso existe.

Gracias de antemano por su ayuda !! :)

+4

¿Cómo puede ser que 'help (isinstance)' sea más difícil que tomarse el tiempo para publicar en SO? o_0 – rantanplan

+0

Vale la pena señalar que el tipo/clase de comprobación es [generalmente desaconsejado] (http://stackoverflow.com/questions/1549801/differences-between-isinstance-and-type-in-python). Duck-typing y 'try' /' except' se consideran una mejor práctica. – yentsun

Respuesta

25

Puede pasar una tupla de clases como segundo argumento a isinstance.

>>> isinstance(u'hello', (basestring, str, unicode)) 
True 

Mirando hacia arriba la cadena de documentación tendría también le dijo que aunque;)

>>> help(isinstance) 
Help on built-in function isinstance in module __builtin__: 

isinstance(...) 
    isinstance(object, class-or-type-or-tuple) -> bool 

    Return whether an object is an instance of a class or of a subclass thereof. 
    With a type as second argument, return whether that is the object's type. 
    The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for 
    isinstance(x, A) or isinstance(x, B) or ... (etc.). 
+0

¿Qué pasa con 'isinstance (x, A) y isinstance (x, B)'? ¿Hay una manera fácil de hacer eso? –

2

isinstance(obj, (Class1, Class2, ..., ClassN)) o isinstance(obj, BaseClass) si tienen un ancestro común.

Dicho esto, debe pensar dos veces antes de usar esto. La verificación explícita de tipos como esta puede dañar la genérica del código, por lo que será mejor que tengas una razón para descartar el tipado.

-1

Otra manera de hacerlo, aunque sin comprobación de subclase:

>>> obj = Class2() 
>>> type(obj) in (Class1, Class2, Class3) 
True 

Nota. Probablemente esto solo sea para tomar en consideración, no para uso práctico.

+0

No es lo mismo. No considerará subclases como 'isinstance'. –

+0

@CatPlusPlus Haré una nota sobre ese – yentsun

+1

@yentsun Tampoco funciona bien con las clases de estilo antiguo. Las instancias 'class A: pass' y' class B: pass' tendrán el mismo tipo de '' y no pasarán esa prueba. –

Cuestiones relacionadas