Hallo,
Hab mal wieder einige Fragen parat.
1. Frage:
Wenn ich eine Klasse definiere, und in dieser Funktionen, kann ich nicht einfach die Funktion mit klasse.funktion(args) aufrufen.
Warum das nicht?
2. Frage:
Wo ist die Grenze zwischen einer Klasse und einem Object in Python.
3. Frage:
Wie entscheide ich, welche Funktionen einer Klasse (Objekt?) in der __init__() aufrufe, und welche ich später im Hauptprogramm aufrufe?
4. Frage:
Wie sieht es mit soetwas aus: Ich erstelle eine Klasse, für meine GUI, und dabei eine Funktion zum Hinzufügen eines Tabs.
Die Eigenschaften des Tabs speichere ich immer in self.tabs.tabname
Um also einen Tab mit einem Variablen Tabnamen zu speichern könnte ich exec() verwenden.
Ist das nur schlechter Stil, oder absolut undenkbar?
Was wäre eine Alternative?
self.tabs als Dictionary self.tabs.tab[tabname][eigenschaft] = blub?
Bzw (falls das überhaupt funktioniert) self.tabs.tab[tabname].eigenschaft = blub
lg,
...
Fragen zu Classen und Objekten
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Ad 1) Weil alle Funktionsobjekte innerhalb einer Klasse zur Laufzeit zu Methodenobjekten werden, deshalb ueberall self als erstes Argument.
Auswege sind da `classmethod` und `staticmethod`.
Ad 2) Alles in Python ist ein Objekt und Klassenobjekte sind "Funktionen", die eigene Objekte erstellen.
Ad 3) Das solltest du wissen, du schreibst schliesslich den Code. Wenn das nicht reicht, dann stell die Frage mal genauer.
Ad 4) Ja `exec` ist fuer sowas tunlichst zu vermeiden. Ich kann deiner Erklaerung aber nicht folgen, warum du ueberhaupt `exec` oder ein Dictionary brauchst. Die alternative ist im uebrigen noch eine `Tab` Klasse.
http://tutorial.pocoo.org/classes.html
http://docs.python.org/reference/compou ... efinitions
http://docs.python.org/reference/datamo ... -and-types
Auswege sind da `classmethod` und `staticmethod`.
Ad 2) Alles in Python ist ein Objekt und Klassenobjekte sind "Funktionen", die eigene Objekte erstellen.
Ad 3) Das solltest du wissen, du schreibst schliesslich den Code. Wenn das nicht reicht, dann stell die Frage mal genauer.
Ad 4) Ja `exec` ist fuer sowas tunlichst zu vermeiden. Ich kann deiner Erklaerung aber nicht folgen, warum du ueberhaupt `exec` oder ein Dictionary brauchst. Die alternative ist im uebrigen noch eine `Tab` Klasse.
http://tutorial.pocoo.org/classes.html
http://docs.python.org/reference/compou ... efinitions
http://docs.python.org/reference/datamo ... -and-types
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Ad 4:
Speziell tritt das hierbei auf:
Ich erstelle eine GUI.
Dabei habe ich eine Klasse geschrieben, in welcher ein Widget erstellt wird, in welchem Checkboxen in einem Gridlayout angeordnet werden.
Als Eigenschaften gibt es:
self.columns: Soviele Spalten soll das Gridlayout haben
Jetzt sollen über die Funktion
checkboxen.addCheckbox('neuercheckboxname') Checkboxen nach belieben angefügt werden können.
z.B, in dem ich den User per Raw-Input namen geben lasse, bis er den Namen einmal leer lässt...
Später muss ich ja irgendwie auf diese Checkboxen wieder zugreifen können, weshalb ich sie irgendwie bennenen muss...
Ich hab das jetzt tatsächlich mit einem Dictionary gemacht.
Bei jeder Eingabe wird ein Eintrag: 'checkboxname':QtGui.QCheckbox
hinzugefügt.
so kann ich später über instance.mydict[checkboxname].isChecked() (oder so) abfragen, ob sie angeklickt wurde, oder nicht...
Wenn ich das Dictionary weglassen würde wüsste ICH nicht, wie ich an diese info noch kommen sollte...
Früher hatte ich es so gelöst, das ich tatsächlich den Namen erstellt hatte.
da hatte ich dann halt:
exec('myblub.check_' + checkboxname + ' = QtGui.QCheckbox()') verwendet.
Speziell tritt das hierbei auf:
Ich erstelle eine GUI.
Dabei habe ich eine Klasse geschrieben, in welcher ein Widget erstellt wird, in welchem Checkboxen in einem Gridlayout angeordnet werden.
Als Eigenschaften gibt es:
self.columns: Soviele Spalten soll das Gridlayout haben
Jetzt sollen über die Funktion
checkboxen.addCheckbox('neuercheckboxname') Checkboxen nach belieben angefügt werden können.
z.B, in dem ich den User per Raw-Input namen geben lasse, bis er den Namen einmal leer lässt...
Später muss ich ja irgendwie auf diese Checkboxen wieder zugreifen können, weshalb ich sie irgendwie bennenen muss...
Ich hab das jetzt tatsächlich mit einem Dictionary gemacht.
Bei jeder Eingabe wird ein Eintrag: 'checkboxname':QtGui.QCheckbox
hinzugefügt.
so kann ich später über instance.mydict[checkboxname].isChecked() (oder so) abfragen, ob sie angeklickt wurde, oder nicht...
Wenn ich das Dictionary weglassen würde wüsste ICH nicht, wie ich an diese info noch kommen sollte...
Früher hatte ich es so gelöst, das ich tatsächlich den Namen erstellt hatte.
da hatte ich dann halt:
exec('myblub.check_' + checkboxname + ' = QtGui.QCheckbox()') verwendet.
Ich habe jetzt die Funktion:
Jetzt geht es leider sehr stark richtung PyQt...
Dennoch:
Ich möchte jetzt noch, das wenn die Checkbox angeklickt wird, deren Name in eine Liste geschrieben wird, bzw. wieder gelöscht wird.
Die Zeile müsste ja in etwa so aussehen (für ein Signal bei der Checkbox name = 'testcheck')
QtCore.QObject.connect(self.Widget.check_testcheck, QtCore.SIGNAL("stateChanged()"), self.meineFunktion)
Wie kann ich jetzt in meineFunktion herausbekommen, welche Checkbox das war, bzw. wie deren Name ist.
Ich würde gerne eine Funktion mit dem Objekt (der Checkbox) als Argument aufrufen, auf das ich in der Funktion dann den jeweiligen Namen (checkbox.text) in die Liste schreiben oder löschen...
Allerdings: Dadurch das der Name ja durch Name bezeichnet wird, kann ich ja kaum reinschreiben:
getattr(self.Widget, 'check_' + name) um das mit lambda zu übergeben, da sich ja name immer ändert, bzw. garnichtmehr vorhanden sein wird...
Was soll ich nur machen?
Code: Alles auswählen
def addCheckbox(self, name):
setattr(self.Widget, 'check_' + name, QtGui.QCheckBox(self.Widget))
getattr('self.Widget', 'check_' + name).setObjectName('check_' + name)
getattr('self.Widget', 'check_' + name).setText(name)
index = self.Widget.GridLayout.count()
self.Widget.GridLayout.addWidget(
getattr(self.Widget, 'check_' + name),
index/self.columns,
index-((index/self.columns)*self.columns), 1, 1
)
Dennoch:
Ich möchte jetzt noch, das wenn die Checkbox angeklickt wird, deren Name in eine Liste geschrieben wird, bzw. wieder gelöscht wird.
Die Zeile müsste ja in etwa so aussehen (für ein Signal bei der Checkbox name = 'testcheck')
QtCore.QObject.connect(self.Widget.check_testcheck, QtCore.SIGNAL("stateChanged()"), self.meineFunktion)
Wie kann ich jetzt in meineFunktion herausbekommen, welche Checkbox das war, bzw. wie deren Name ist.
Ich würde gerne eine Funktion mit dem Objekt (der Checkbox) als Argument aufrufen, auf das ich in der Funktion dann den jeweiligen Namen (checkbox.text) in die Liste schreiben oder löschen...
Allerdings: Dadurch das der Name ja durch Name bezeichnet wird, kann ich ja kaum reinschreiben:
getattr(self.Widget, 'check_' + name) um das mit lambda zu übergeben, da sich ja name immer ändert, bzw. garnichtmehr vorhanden sein wird...
Was soll ich nur machen?