2013-04-05 13 views
8

eine einfache Klasse Angenommen:Wie eine Variable Klassenobjekt überprüfen oder nicht

class MyClass(object): 
    pass 

. 
. 
. 
m = MyClass 
print type(m) # gets: <type 'classobj'> 
# if m is classobj, how can i check a variable is class object? 

Meine Frage ist: Wie kann ich eine Variable ein Klassenobjekt ist?

eine einfache Lösung:

if str(type(m)) == "<type 'classobj'>": 
    # do something 

Aber ich denke, dass es zumindest eine klassische Art und Weise ist, dass zu überprüfen.

+1

Der Code, den Sie oben gezeigt haben, wird '' für 'type (m)' nicht ausgeben, weil 'm' eine neue Stilklasse ist. Es wird '' gedruckt. Sie erhalten nur '' für klassische Klassen. – abarnert

Antwort

12

In 2.x kann ein Klassenobjekt ein type (neue Stilklassen) oder ein classobj (klassische Klassen) sein. Der type Typ ist ein eingebauter, aber der classobj Typ ist nicht. Also, wie bekommst du es? Das ist, was das types Modul für ist.

isinstance(MyClass, (types.TypeType, types.ClassType)) 

In 3.x, brauchen Sie sich nicht um klassische Klassen zu kümmern, so:

isinstance(MyClass, type) 

Auch wenn Sie die Typen direkt miteinander vergleichen wollen, sollten Sie nie vergleichen alle Objekte durch ihre str. Vergleichen:

>>> class MyClassicClass: 
...  pass 
>>> str(type(MyClassicClass)) == "<type 'classobj'>" 
True 
>>> str("<type 'classobj'>") == "<type 'classobj'>" 
True 

können Sie fast immer vergleichen nur Objekte direkt:

>>> type(MyClassicClass) == types.ClassType 
True 
>>> "<type 'classobj'>" == types.ClassType 
False 

(Und in den unglaublich seltenen Fällen, in denen Sie wirklich die String-Darstellung aus irgendeinem Grund brauchen vergleichen zu können, sollten Sie die repr

+0

Perfekt, danke im Voraus. – pylover

+1

Dies ist eine ausgezeichnete Antwort. +1 (mehr wenn ich könnte) – mgilson

+0

+1. Ich mag Jochens Antwort für seine Einfachheit, aber das ist eine gute Erklärung. – Nitzle

3

Ist das wonach Sie suchen?

>>> class A(object): 
... pass 
>>> isinstance(A, type) 
True 

>>> isinstance("asd", type) 
False 

Aber funktioniert nur für Klassen von Objekt geerbt.

+0

Ich bin mir ziemlich sicher, dass dies nicht das ist, wonach OP sucht. – mgilson

2

Eine neue Stilklasse (explizit abgeleitet von object wie in Ihrem Beispiel oder implizit in Python 3) ist nicht vom Typ classobj. Nur Old-Style-Klassen sind classobj s. Also für Ihre Beispielklasse wie geschrieben, können Sie einfach überprüfen, um zu sehen, ob MyClass eine Instanz von type ist, wie alle neuen Stil Klassen sind:

isinstance(MyClass, type) 

Da alle neuen Stil Klassen von object abgeleitet sind, können Sie auch do:

issubclass(MyClass, object) 

würde ich abraten:

type(MyClass) == type 

Dies wird fehlschlagen, wenn der Typ einer Klasse nichtist, aber eine Metaklasse. Natürlich kann es dafür auch Anwendungsfälle geben.

Wenn Sie wirklich brauchen, um zu sehen, ob Sie eine im alten Stil Klasse haben, können Sie das types Modul importieren und types.ClassType verwenden oder erklären nur einen alten Stil-Klasse und sehen, ob die Klasse, die Sie testen sind, ist von die gleiche Art:

class OldStyleClass: 
    pass 
OldStyleClass = type(OldStyleClass) 

isinstance(MyClass, OldStyleClass) 
22

Verwendung inspect:

import inspect 
print inspect.isclass(obj) 
+0

+1 für inspect Modul – pylover

+0

Nun, warum habe ich nicht daran gedacht ... (+1) – mgilson

+0

Ich weiß nicht, wie ich das vergessen habe, aber das ist eine bessere Antwort als meine (und die Entsprechungen zu meinen). – abarnert

-1

Manchmal ist die nächste funktioniert (wenn Sie feststellen möchten, wie das Objekt drucken):

def is_class(o): 
    return hasattr(o, '__dict__') 
+0

die meisten Objekte einschließlich Klassen, hat dieses Attribut – pylover

+0

@pylover Entschuldigung, ich antwortete auf eine andere Frage: "Wie zu bestimmen, ob eine Variable eine Klasseninstanz ist". Ich stimme dir zu. Aber könnten Sie ein Beispiel für Objekte geben, die keine Klassen sind und dieses Attribut haben? – sergzach

+0

Nein, die Frage ist 'Wie überprüft man eine Variable ist Klasse ** OBJECT ** oder nicht ', nicht INSTANCE – pylover

Verwandte Themen