Seite 1 von 1

Klassenfunktionen extern definieren

Verfasst: Freitag 22. Januar 2021, 21:08
von testobject
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.

Re: Klassenfunktionen extern definieren

Verfasst: Freitag 22. Januar 2021, 21:37
von Sirius3
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.

Re: Klassenfunktionen extern definieren

Verfasst: Freitag 22. Januar 2021, 21:51
von __blackjack__
@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.

Re: Klassenfunktionen extern definieren

Verfasst: Freitag 22. Januar 2021, 22:04
von testobject
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.

Re: Klassenfunktionen extern definieren

Verfasst: Freitag 22. Januar 2021, 22:43
von __blackjack__
@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.

Re: Klassenfunktionen extern definieren

Verfasst: Montag 25. Januar 2021, 21:24
von testobject
Ich werde mein Verständnis von Klassen und deren Einsatz wohl nochmal hinterfragen müssen. Danke für den Input.