Klassenfunktionen extern definieren

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
testobject
User
Beiträge: 3
Registriert: Freitag 22. Januar 2021, 20:42

Hallo zusammen,

ich arbeite derzeit an einem privaten Projekt, verwende hierfür Python 3 und habe bisher eher weniger Erfahrung mit Python.

Ich möchte in einem Modul eine Klasse definieren.
Diese Klasse soll mehrere Funktionen besitzen, die mit den Instanzvariablen arbeiten. Wie ich grundsätzlich solche Funktionen anlege, ist mir klar. Mein Problem besteht darin, dass jede einzelne Funktion (aus einem Matlab-Projekt übersetzt) mehrere hundert Zeilen Code besitzt.
Dadurch, dass es nun mehrere Funktionen sind, wäre das python-file das die Klassendefinition beinhaltet mehrere tausend Zeilen lang. Ich würde es der Übersichtlichkeit halber schöner finden, wenn die Funktionen lediglich in der Klasse deklariert werden, die eigentliche Definition der einzelnen Funktionen aber jeweils in eigenen files stattfindet. Ich habe herausgefunden, dass sich das mit staticfunctions umsetzen lässt, wie an folgendem Beispiel zu sehen ist:

main.py:

Code: Alles auswählen

#testfile main
from testclass import test

t=test()

t.classfunc()
Klassendefinition: testclass.py

Code: Alles auswählen

import clfunction

class test:
	def __init__(self):
		self.var1=1
		self.var2=2
	
	func = staticmethod(clfunction.clfunction)
	def classfunc(self):
		self.func(self)
Klassenfunktionsdefinition in clfunction.py

Code: Alles auswählen

def clfunction(self):
	print(self.var1+self.var2)
	self.var1=200

Ich finde diese Vorgehensweise etwas umständlich, zumal die eigentliche Funktion drei verschiedene Namen benötigt: einmal den Namen der Definiton clfunction, dann den Namen func wenn sie mit staticfunction zugewiesen wird und dann nochmal den eigentlichen gewollten Klassenfunktionsnamen classfunc der im optimalen Fall genauso wie clfunction heißen sollte.
Wie geht ihr Profis mit soetwas um? Gibt es hier einen komfortableren Weg Klassenfunktionen extern zu definieren? Weiterhin würde mich interessieren, wie hier die allgemeine Konvention aussieht? Werden normalerweise die Funktionen in der Klasse vollständig definiert, auch wenn dann die Klasse aus mehreren tausend Zeilen Code besteht?

Vielen Dank schon mal.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Die erste Frage wäre ja, ob das wirklich alles Methoden einer Klasse sein müssen, ob man nicht manche Teile als unabhängige Funktionen definieren kann, weil schon eine einzelne Funktion mit mehreren hundert Zeilen zu lange ist.
So lange man die Funktionen nicht thematisch trennen kann, macht es wenig Sinn, das ganze in mehrere Module aufzuteilen.
Benutzeravatar
__blackjack__
User
Beiträge: 13112
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@testobject: Das geht auch ohne `staticmethod()` und irgendwelche zusätzlichen Namen, aber ich würde auch hinterfragen was da nicht stimmt mit dem Code, denn *mehrere* Funktionen die aus *mehreren* hundert Zeilen Code bestehen klingen erst mal sehr komisch. Eine Funktion hat in der Regel so 25 bis 50 Zeilen Code. Mehr ist ungewöhnlich.

Und ja, Klassen werden üblicherweise komplett definiert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
testobject
User
Beiträge: 3
Registriert: Freitag 22. Januar 2021, 20:42

Also Hintergrund, warum die Funktionen so lang sind, besteht darin, dass es sich um mathematische Berechnungen handelt, bei denen komplexere Algorithmen angewandt werden, bis endlich das eigentlich interessante Endergebnis erscheint. Bedeutet die einzelnen Zwischenergebnisse sind absolut uninteressant, weshalb die gesamte Berechnung jeweils in eine einzelne Funktion gepackt ist.

An einem Beispiel:
Ich habe eine Klasse Ottomotor.
Der Ottomotor hat x-verschiedene Parameter wie Länge, Breite, Anzahl Zylinder...
Im Hauptprogramm wird ein Ottomotor "Testmotor" angelegt und all die relevanten Parameter werden eingegeben. Anschließend kann für diesen "Testmotor" eine Modalanalyse durchgeführt werden, die ausgehend von allen Daten das Frequenzspektrum zurückgibt, das dieser spezifische Motor hat. Der Algorithmus zur Berechnung des Frequenzspektrums ist dabei nur für die Klasse Ottomotor gültig, kann anderweitig nicht eingesetzt werden und soll jeweils nur für die betrachtete Instanz die Berechnung durchführen, deshalb wollte ich die Funktion in die Klasse packen.
Das Ergebnis soll dann auch im Testmotor gespeichert werden.

Ich dachte hier würde eine Klassenfunktion Sinn machen, aber ich bin offen für praktikablere Ansätze und dankbar für Tipps.
Benutzeravatar
__blackjack__
User
Beiträge: 13112
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@testobject: Klingt trotzdem immer noch komisch und dass das Ergebnis auch im Objekt gespeichert wird klingt falsch. Das klingt so ein bisschen danach als wenn globale Variablen und ”Funktionen” in eine Klasse verschoben wurde.

Und auch wenn Zwischenergebnisse uninteressant sind, können die trotzdem durch eigene Funktionen berechnet werden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
testobject
User
Beiträge: 3
Registriert: Freitag 22. Januar 2021, 20:42

Ich werde mein Verständnis von Klassen und deren Einsatz wohl nochmal hinterfragen müssen. Danke für den Input.
Antworten