Seite 1 von 1

mit isinstance Typ eines Objekts prüfen

Verfasst: Sonntag 6. Dezember 2009, 15:26
von scrawl
Hallo,

mal angenommen, ich habe in der Variable obj eine Referenz auf ein beliebiges Objekt, und habe keine Ahnung, wo das Objekt herkommt. Kann ich dann mit isinstance prüfen, um was für ein Objekt es sich handelt? Konkret geht es darum, dass ich eine Liste mit verschiedenen Objekten habe, alle aus unterschiedlichen Klassen, und daraus das Objekt der Klasse "RBIRadioSource" haben möchte. Ich weiß aber nicht, wo die RBIRadioSource Klasse definiert habe. Versucht habe ich das hier:

Code: Alles auswählen

if isinstance(obj, RBIRadioSource):
Ich bekomme aber den Fehler: NameError: global name 'RBIRadioSource' is not defined

Ist ja auch logisch, weil ich keine Ahnung habe, wo die Klasse RBIRadioSource definiert ist. Kann ich trotzdem irgendwie den Typ prüfen?

Verfasst: Sonntag 6. Dezember 2009, 15:36
von cofi
Nein, du kannst mit `isinstance` ueberpruefen, ob ein Objekt ein Exemplar einer _bekannten_ Klasse ist.

Aber vielleicht hilft dir `type` beim herausfinden weiter?

Verfasst: Sonntag 6. Dezember 2009, 15:45
von scrawl
type(props) gibt mir im entsprechenden Fall <class '__main__.RBIRadioSource'>

andere Werte sind z.B. <__main__.RBLibrarySource object at 0x3afc820 (RBLibrarySource at 0x24e9020)>

Irgendwie muss ich die doch voneinander unterscheiden können?

Verfasst: Sonntag 6. Dezember 2009, 15:54
von Dav1d
Die Klasse ist in __main__ also müsste isinstance doch funktionieren

Verfasst: Sonntag 6. Dezember 2009, 16:03
von scrawl
>>> print radio_source
<__main__.RBIRadioSource object at 0x3afc190 (RBIRadioSource at 0x2cc4000)>
>>> __main__.RBIRadioSource
Traceback (most recent call last):
File "/usr/lib/rhythmbox/plugins/python-console/pythonconsole.py", line 389, in __run
r = eval(command, self.namespace, self.namespace)
File "<string>", line 1, in <module>
NameError: name '__main__' is not defined
>>> __main__
Traceback (most recent call last):
File "/usr/lib/rhythmbox/plugins/python-console/pythonconsole.py", line 389, in __run
r = eval(command, self.namespace, self.namespace)
File "<string>", line 1, in <module>
NameError: name '__main__' is not defined
>>>
>>> print __main__
Traceback (most recent call last):
File "/usr/lib/rhythmbox/plugins/python-console/pythonconsole.py", line 393, in __run
exec command in self.namespace
File "<string>", line 1, in <module>
NameError: name '__main__' is not defined
Was bedeutet __main__ denn genau? Und wie kann ich darauf zugreifen? Da die Objekte ja dann eigentlich alle "Children" von __main__ sind, könnte ich vllt. von irgendeinem Objekt auf den Parent zugreifen und davon das Child RBIRadioSource?[/quote]

Verfasst: Sonntag 6. Dezember 2009, 16:10
von snafu
Wäre vielleicht nicht schlecht gewesen, zu erwähnen, dass du keine normale Python-Shell verwendest, sondern die von Rhythmbox.

Verfasst: Sonntag 6. Dezember 2009, 16:24
von scrawl
Ich benutze ja auch die normale Python-Shell (wird übrigens ein Plugin für Rhythmbox). Nur zum Testen benutze ich gerade die Shell von Rhythmbox.