Fragen zu Classen und Objekten

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
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

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,
...
Benutzeravatar
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
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

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

@...: Zu 4.: Es gibt `getattr()` und `setattr()`.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Ich habe jetzt die Funktion:

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
                                     )
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?
Antworten