isinstance oder wie vergleicht man typen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Jede Klasse bekommt eine class_id und die kann man dann abfragen, ohne etwas zu importieren.
Wenn man das aber auch für alle Klassen aus allen importierten Modulen durchziehen will, wird es etwas aufwendig.

Code: Alles auswählen

import AbqDraw
 
class Edge(object):
    def __init__(self):
        self.parent = None
        self.label = None
        self.nodes = None
        self.class_id = 'FEMesh.Edge'
       
    def create_edge(self):
        pass
 
#########################
if __name__ == '__main__':
    print 'within FEMesh.py'
    edge = Edge()
    draw = AbqDraw.drawing()
    draw.draw_edge(edge)
Wenn man aber auch Vererbung dabei braucht kann man class id Klassen machen, wobei dann class id Klassen andere class id Klassen als Basisklassen haben können.

Diese class id Klassen nebst class id Objekten hat man in einem Modul, das man überall importieren kann ohne kreuzweise. Das habe ich auch so gemacht mit Namen für widgets. Ein Name kann ein String sein oder ein Objekt einer Namensklasse.

Das löst natürlich nicht den Fall ganz am Anfang, nämlich dass man Edge zweimal definiert im Mainscript und im Modul.

Aber ich könnte dann den kreuzweisen Import vermeiden.

Jetzt habe ich für mich noch eine viel einfachere Lösung gefunden: ich brauche ja nicht abzufragen, ob eine Widget eine Instanz von einer meiner ttk Klassen ist, sondern es geht genauso ob es eine Instanz der original ttk Klassen ist.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: welches Problem soll denn jetzt diese »class_id« lösen?
Alfons Mittelmeyer hat geschrieben:Jetzt habe ich für mich noch eine viel einfachere Lösung gefunden: ich brauche ja nicht abzufragen, ob eine Widget eine Instanz von einer meiner ttk Klassen ist, sondern es geht genauso ob es eine Instanz der original ttk Klassen ist.
Es geht noch einfacher: gar nicht abfragen, ob ein Objekt Instanz einer bestimmten Klasse ist. Das ist nämlich so gut wie nie nötig und deutet wenn dann auf einen Designfehler hin.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sirius3 hat geschrieben:@Alfons Mittelmeyer: welches Problem soll denn jetzt diese »class_id« lösen?
Es geht noch einfacher: gar nicht abfragen, ob ein Objekt Instanz einer bestimmten Klasse ist. Das ist nämlich so gut wie nie nötig und deutet wenn dann auf einen Designfehler hin.
Natürlich ist das nötig. In einem Menü biete ich nicht an, dass man da Labels, Buttons, Frames und dergleichen anlegen kann. In einem Notebook oder PanedWindow biete ich kein grid, place oder pack an. Oder sollte ich das?
calo
User
Beiträge: 52
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

@Alle

vielen Dank für die vielen Beiträge und guten Vorschläge.

Eines vorweg: FEMEsh.py ist selbst nur ein Unter-Modul (und kein Mainskript), dass von einem Kernel-Skript geladen wird. Daher habe ich nun zum testen eine FEMesh_test_suite.py geschrieben. Und so funktioniert es, ...und das, ganz ohne Kreuzimporte :D :

Code: Alles auswählen

# FEMesh_test_suite.py

from FEMesh import *
from AbqDraw import *

edge = Edge()           
draw = drawing()
draw.draw_edge(edge)

Code: Alles auswählen

# FEMesh.py

class Edge(object):
    def __init__(self):
        self.parent = 0
        self.label = 0
        self.referenced_elements = []
        self.nodes = 0

    def create_edge(self):
        pass

    def del_edge(self):
        pass

class EdgeArray(list):
    def __init__(self, parent, name=None, edges=[]):
        list.__init__(self, edges)
        self.parent = parent
        self.array_name = name

    def add_edge(self, node_pair, eid):
        pass

    def del_edges(self, edges):
        pass


#######################################
if __name__ == '__main__':
    print 'within FEMesh.py'

Code: Alles auswählen

# AbqDraw.py

import FEMesh 

class drawing(object):
    def __init__(self):
        self.vertices = []
        self.lines = []

    def draw_edge(self, edges):
        if isinstance(edges, FEMesh.Edge):
            print type(edges)
            print FEMesh.Edge

        elif isinstance(edges, FEMesh.EdgeArray):
            print type(edges)
            print FEMesh.Edge



#######################################
if __name__ == '__main__':
    print 'within AbqDraw.py'
Nochmals rechtherzlichen Dank an alle.
Antworten