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: 919
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Dienstag 28. Juni 2005, 20:34

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

Dienstag 28. Juni 2005, 20:54

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: 919
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Dienstag 28. Juni 2005, 21:07

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

Dienstag 28. Juni 2005, 21:41

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 29. Juni 2005, 09:42

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Damaskus
Administrator
Beiträge: 919
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Mittwoch 29. Juni 2005, 11:58

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 29. Juni 2005, 12:48

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Damaskus
Administrator
Beiträge: 919
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Mittwoch 29. Juni 2005, 17:40

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