Seite 1 von 1

Funktion in einer anderen Klasse aufrufen --> WIE?

Verfasst: Dienstag 28. Juni 2005, 20:34
von Damaskus
Hallo,
ich möchte eine Funktion in einer anderen Klasse aufrufen.
Nur wie mache ich das? So wie unten dargestellt hab ich mir das vorgestellt. Aber so will es nicht...

Code: Alles auswählen

class test1:
  def test():
    pass

class test2:
  def test2():
    test1.test()

Verfasst: Dienstag 28. Juni 2005, 20:54
von tabellar
Hi Damaskus,

zwei Möglichkeiten:

Code: Alles auswählen

#Zu Fuss:
class test1:
    def fct1(self):
        print 'hallo'
 
class test2:
    def fct2(self):
        t1=test1()
        t1.fct1()

#main
t2=test2()
t2.fct2()
hallo

Code: Alles auswählen

#Vererbung:
class test1:
    def fct1(self):
        print 'hallo'


class test2(test1):
    def fct2(self):
        self.fct1()

#main
t2=test2()
t2.fct2()
hallo
Tabellar :wink:

Verfasst: Dienstag 28. Juni 2005, 21:07
von Damaskus
Danke.
Ich hab mich für die Vererbung entschieden.

Code: Alles auswählen

#Vererbung:
class test1:
    def fct1(self):
        print 'hallo'


class test2(test1):
    def fct2(self):
        self.fct1()

#main
t2=test2()
t2.fct2()
hallo
Tabellar :wink:[/quote]

Verfasst: Dienstag 28. Juni 2005, 21:41
von BlackJack
Vererbung sollte man eigentlich nur einsetzen, wenn eine Klasse wirklich ein spezialisierteres Objekt der anderen ist, also eine echte "ist-ein(e)" zwischen den Klassen besteht.

Wenn das nicht der Fall ist, dann kann man die Methode der ersten Klasse zu einer Funktion machen, d.h. sie aus der Klasse herausnehmen und ins Modul stecken, oder eine `staticmethod`, oder in einigen Fällen auch eine `classmethod`, daraus machen.

Verfasst: Mittwoch 29. Juni 2005, 09:42
von jens
Dazu habe ich einen alten Linux-Magazin Artikel gefunden:
Das neue Klassenmodell in Python 2.2

Ach, nochmal zu dem ursprünglichen Beispiel. Ich hätte es so gemacht:

Code: Alles auswählen

class test1:
  def test():
    pass

class test2:
  def test2():
    test1().test() 

Verfasst: Mittwoch 29. Juni 2005, 11:58
von Damaskus
Danke für eure Hilfe!
Es klappt zwar nur das Ergebnis ist nicht das was ich wollte.

Ich umschreib es mal kurz:
Ich hab mit Glade eine Oberfläche gebastelt in der sich in der Hauptansicht ein TreeView befindet. Und dieser wird durch einen anderen Dialog mit Daten gefüttert. Und jetzt muss ich ja jedes mal nachdem ich Daten über diesen Dialog eingegeben hab, den TreeView aktualisieren.
Und da ich die Funktion um den TreeView anzuzeigen und mit einem "Startwert" zu füllen schon hatte, dachte ich ich muss di Funktion einfach nochmal aufrufen um den TreeView zu aktualisieren. Nur funktioniert das so nicht :?
Als Ergebnis klatsch mir Python eine zweite Liste in das Widget rein. Anstatt das er es aktualisiert. Also muss ich im Prinzip das ganze nochmal komplett überdenken.
Hier mal der Code dazu.
Wenn jemand eine Idee oder noch besser einen Codefetzen hat aus dem ich mir das abschauen bzw. klar machen kann wie das klappt wär ich echt dankbar.

Code: Alles auswählen


#Anzeige

class Hauptfenster:
  
  def __init__(self):
    global gladedatei
    gladedatei = gtk.glade.XML('hauptfenster.glade', 'gladeHauptfenster')
    self.ansicht()

  def ansicht(self):
    
    empfaengerlistelaenge = len(empfaengerliste)
    print empfaengerlistelaenge
    self.listeempf = gtk.ListStore(str, str)
    self.liste = gladedatei.get_widget('empftreeview')
    self.liste.set_model(self.listeempf)
    self.liste.columns_autosize()
    renderer = gtk.CellRendererText()
    column1 = gtk.TreeViewColumn('Nachname', renderer, text=0, foreground=1)
    self.liste.append_column(column1)
    
    iterator = self.listeempf.append()
    self.listeempf.set_value(iterator, 0, "test")
    self.listeempf.set_value(iterator, 0, "test2")

Code: Alles auswählen


#Dialog zur Datenerfassung

  def __init__(self):
    self.gladedateiempf = gtk.glade.XML('hauptfenster.glade', 'gladeNeuerEmpfaenger')
    self.gladedateiempfwidget = self.gladedateiempf.get_widget('gladeNeuerEmpfaenger')
            
    self.empfbuttonabbrechen = self.gladedateiempf.get_widget('empfbuttonabbrechen')
    self.empfbuttonok = self.gladedateiempf.get_widget('empfbuttonok')
    self.empfbuttonabbrechen.connect('clicked', self.on_empfbuttonabbrechen_clicked)
    self.empfbuttonok.connect('clicked', self.on_empfbuttonok_clicked)
    
  def on_empfbuttonabbrechen_clicked(self, handler):
    self.gladedateiempfwidget.destroy()
  
  def on_empfbuttonok_clicked(self, handler):
    
    self.empfentryvorname = self.gladedateiempf.get_widget('empfentryvorname')
    vorname = self.empfentryvorname.get_text()
    if vorname == "":
      text = "vorname"
      self.errordialog(text)
    else:
      self.empfentrynachname = self.gladedateiempf.get_widget('empfentrynachname')
      nachname = self.empfentrynachname.get_text()
      if nachname == "":
        text = "nachname"
        self.errordialog(text)
      else:
        self.empfentryvorwahl = self.gladedateiempf.get_widget('empfentryvorwahl')
        auswahlvorwahl = self.empfentryvorwahl.get_text()
        if auswahlvorwahl == "":
          text = "vorwahl"
          self.errordialog(text)
        else:
          self.empfentryrufnummer = self.gladedateiempf.get_widget('empfentryrufnummer')
          rufnummer = self.empfentryrufnummer.get_text()
          if rufnummer == "":
            text = "rufnummer"
            self.errordialog(text)
          elif rufnummer.isdigit():
            empflisteneintrag = [vorname, nachname, netz, laenderkennung, vorwahl, rufnummer]
            empfaengerliste.append(empflisteneintrag)
            self.gladedateiempfwidget.destroy()
            Hauptfenster().ansicht()
          else:
            text = "falsche_rufnummer"
            self.errordialog(text)

  def errordialog(self):
    pass
Naja es sit nicht unbedingt der sauberste Code den es gibt. Aber es ist immerhin mein Erstlingswerk! Und ich will es jetzt erstmal zum laufen bringen und mir danach gedanken machen wie ich den Code besser bzw. eleganter schreiben kann.

Thx
Damaskus

Verfasst: Mittwoch 29. Juni 2005, 12:48
von jens
Dann gibt deiner Unterklasse doch einfach das Hauptfenster mit... Ungefähr so:

Code: Alles auswählen

    #Dialog zur Datenerfassung

    def __init__(self, Hauptfenster):
        [...]
        self.Hauptfenster = Hauptfenster
    
    
    def on_empfbuttonok_clicked(self, handler):
        [...]
        self.Hauptfenster.ansicht()

Verfasst: Mittwoch 29. Juni 2005, 17:40
von Damaskus
jens hat geschrieben:Dann gibt deiner Unterklasse doch einfach das Hauptfenster mit... Ungefähr so:

Code: Alles auswählen

    #Dialog zur Datenerfassung

    def __init__(self, Hauptfenster):
        [...]
        self.Hauptfenster = Hauptfenster
    
    
    def on_empfbuttonok_clicked(self, handler):
        [...]
        self.Hauptfenster.ansicht()
Bringt mir in dem Fall erstmal nix.
Weil ich mich erst mal schlau machen muss wie ich die Liste aktualisieren kann. Aber trotzdem Danke. Werds nacher mal ausprobieren.