2012-05-05 13 views
8

Chcę sprawdzić, czy obiekt jest instancją dowolnej klasy w listy/grupy klas, ale nie mogę znaleźć, jeśli istnieje nawet pythonic sposób robić to bez robieniaJak porównać dziedziczenie z kilkoma klasami?

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

mam na myśli , porównując klasę po klasie.

Byłoby bardziej prawdopodobne, że użyje jakiejś funkcji podobnej do isinstance, która uzyskałaby n liczby klas do porównania, jeśli nawet istnieje.

Z góry dziękuję za pomoc! :)

+4

Jak to możliwe, że 'help (isinstance)' jest trudniejsze niż poświęcenie czasu na publikowanie w SO? o_0 – rantanplan

+0

Warto zauważyć, że sprawdzanie typu/klasy jest [ogólnie rzecz biorąc odradzane] (http://stackoverflow.com/questions/1549801/differences-between-isinstance-and-type-in-python). Kaczkowanie i "try"/"except" są uważane za lepszą praktykę. – yentsun

Odpowiedz

25

Możesz przekazać krotki klas jako drugi argument do instancji.

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

Patrząc na docstring miałoby również powiedział, że chociaż;)

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

Co z 'isinstance (x, A) i isinstance (x, B)'? Czy istnieje prosty sposób na zrobienie tego? –

2

isinstance(obj, (Class1, Class2, ..., ClassN)) lub isinstance(obj, BaseClass) jeśli mają wspólnego przodka.

Powiedziawszy, powinieneś pomyśleć dwa razy przed użyciem tego. Wyraźne sprawdzanie typu może zranić generyczność kodu, więc lepiej mieć powód do rzucania kaczkami.

-1

Innym sposobem, aby to zrobić, choć bez kontroli podklasy:

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

Uwaga. Prawdopodobnie jest to tylko do wzięcia pod uwagę, a nie do praktycznego zastosowania.

+0

Nie to samo. Nie uwzględnia podklas takich jak 'isinstance'. –

+0

@CatPlusPlus Zanotuję na tym – yentsun

+1

@yentsun Również nie gra dobrze z klasami starego stylu. 'class A: pass' i' class B: pass 'instances będą miały ten sam typ instancji '' i nie wykonają tego testu. –

Powiązane problemy