2012-05-05 5 views
8

Ich mag überprüfen, ob ein Objekt eine Instanz einer Klasse in einer Liste/Gruppe der Klassen ist, aber ich kann nicht finden, wenn es sogar ein pythonic Weg, dies zu tun, ohneWie Vererbung mit mehreren Klassen vergleichen?

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

zu tun ich meine , Klasse für Klasse vergleichen.

Es wäre wahrscheinlicher, eine ähnliche Funktion wie isinstance zu verwenden, die eine Anzahl von zu vergleichenden Klassen erhalten würde, falls diese überhaupt existiert.

Vielen Dank im Voraus für Ihre Hilfe !! :)

+4

Wie kann es sein, dass 'help (isinstance)' schwieriger ist als die Zeit, um nach SO zu posten? o_0 – rantanplan

+0

Es ist erwähnenswert, dass die Überprüfung des Typs/der Klasse [generell nicht empfohlen] ist (http://stackoverflow.com/questions/1549801/differences-between-isinstance-and-type-in-python). Duck-typing und 'try' /' except' gelten als eine bessere Übung. – yentsun

Antwort

25

Sie können ein Tupel von Klassen als zweites Argument an isinstance übergeben.

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

die docstring gesagt hätten Sie oben schauen auch, dass, obwohl;)

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

Was ist mit 'isinstance (x, A) und isinstance (x, B)'? Gibt es einen einfachen Weg, das zu tun? –

2

isinstance(obj, (Class1, Class2, ..., ClassN)) oder isinstance(obj, BaseClass), wenn sie einen gemeinsamen Vorfahren haben.

Das gesagt, sollten Sie zweimal überlegen, bevor Sie dies verwenden. Explizite Typprüfungen wie diese können die Generizität des Codes verletzen, also solltest du besser einen Grund haben, Ente wegzuschreiben.

-1

Ein anderer Weg, es zu tun, wenn auch ohne Unterklasse-Check:

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

Hinweis. Wahrscheinlich ist dies nur für die Berücksichtigung, nicht für den praktischen Gebrauch.

+0

Nicht dasselbe. Es berücksichtigt keine Unterklassen wie 'isinstance'. –

+0

@CatPlusPlus Ich mache mir eine Notiz darüber – yentsun

+1

@yentsun Auch spielt es nicht gut mit alten Stilklassen. 'Klasse A: pass 'und' Klasse B: pass' Instanzen haben den gleichen Typ von ' instance '>' und führen diesen Test nicht durch. –

Verwandte Themen