Funktion in einer anderen Klasse aufrufen --> WIE?

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
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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()
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

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:
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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]
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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