2012-05-05 3 views
8

Я хочу, чтобы проверить, если объект является экземпляром какого-либо класса в списке/группы классов, но я не могу найти, если есть даже вещий способ сделать это, не делаяКак сравнить наследование с несколькими классами?

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

я имею в виду , сравнивая класс по классам.

Было бы более вероятно использовать некоторую функцию, подобную isinstance, которая получит n классов классов для сравнения, если это существует.

Заранее благодарим за помощь! :)

+4

Как может быть, что 'help (isinstance)' сложнее, чем использовать время для публикации? o_0 – rantanplan

+0

Стоит отметить, что проверка типа/класса [обычно обескуражена] (http://stackoverflow.com/questions/1549801/differences-between-isinstance-and-type-in-python). Лучшей практикой считается утиная печать и 'try' /' except'. – yentsun

ответ

25

Вы можете передать кортеж классов в качестве второго аргумента isinstance.

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

Глядя на строку документации будет иметь также сказал, что, хотя;)

>>> 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

Как насчет 'isinstance (x, A) и isinstance (x, B)'? Есть ли простой способ сделать это? –

2

isinstance(obj, (Class1, Class2, ..., ClassN)) или isinstance(obj, BaseClass), если они имеют общего предка.

При этом вам следует подумать дважды, прежде чем использовать это. Явная проверка типа, подобная этому, может повредить общему характеру кода, поэтому у вас будет больше причин бросать утку.

-1

Другой способ сделать это, хотя и без проверки подкласса:

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

Примечание. Вероятно, это просто для принятия во внимание, а не для практического использования.

+0

Не то же самое. Он не будет рассматривать подклассы типа 'isinstance'. –

+0

@CatPlusPlus Я сделаю заметку об этом – yentsun

+1

@yentsun Также он не играет хорошо со старыми классами стилей. 'class A: pass' и' class B: pass' будут иметь один и тот же тип '' и не пройдут этот тест. –

Смежные вопросы