automatisch der aufgerufenen Klasse, Infos über aufrufende Klasse geben?

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
Scholastik
User
Beiträge: 53
Registriert: Freitag 7. Juli 2017, 12:35

Folgender Beispielcode:

Code: Alles auswählen

class Helper:
    
    def machA(self,x):
        return x + 5
        
    def machBC(self,y,z):
        return y + z
        
class Macher:
    
    def __init__(self,ID,helper):
        self.ID = ID
        self.helper = helper
        
    def leglos(self):
        a = self.helper.machA(randint(5))
        b = self.helper.machBC(randint(5),a)
        return b
       
        
H = Helper()
for i in range(3):
    Macher(i,H).leglos()
Ich habe also eine Klasse Helper, welche diverse Hilfsfunktionen besitzt, auf die der Macher immer mal wieder zugreifen muss.

Nun soll es aber viele solche Macher geben und auch sehr viele hilfsfunktionen innerhalb der Helper Klasse.
Zusätzlich soll der Helper, jedesmal wenn eine seiner Funktionen aufgerufen wird wissen, welcher Macher diese Fkt aufgerufen hat (um evlt unterschiedliches zu returnen)

Der direkteste Weg der mir nun einfällt, wäre bei jeder einzelnen Funktion zb noch die ID des Machers mit zu übergeben, also "a = self.helper.machA(randint(5),self.ID)" und ebenfalls dann im Helper in der Funktion Code zufügen, damit diese ID ausgelesen wird.

Nun frage ich mich aber, ob es da nicht einen eleganteren Weg für gibt, bei dem ich denselben Code weniger oft in jeder einzelnen Funktion wiederholen muss?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Das sieht konzeptionel kaputt aus.

Warum muss "Helper" das denn wissen? Um auch noch anhand der aufrufenden Klasse zu entscheiden, was zu tun ist?
Scholastik
User
Beiträge: 53
Registriert: Freitag 7. Juli 2017, 12:35

weil im echten Anwendungsfall Helper ein Skript ist welches API Calls unternimmt.
Je nach dem welcher Macher die Fkt aber aufruft, muss ein anderer API Key verwendet werden. Dies hatte ich bei meinem echten Code nicht bedacht und nun fühlt es sich falsch an bei jeder einzelnen Funktion den api key zuzufügen/abzufragen, sondern ich hätte den API Key gerne irgendwie automatisch mit übermittelt, da jeder Macher einen fest zugewiesenen API Key hat.

edit:
man könnte natürlich nicht ein einzige Helper Instanz verwenden, sondern eine pro Macher, aber aus vielerlei Gründen (welche jetzt zu weit führen) muss ich bei einer einzigen Instanz bleiben.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Scholastik: die ganze Helperklasse ist keine Klasse. Wenn das nur einzelne Funktionen sind, dann sollten die auch einzeln aufgerufen werden. Wenn Du einen API-Key zur Abarbeitung brauchst, dann mußt Du den API-Key an die Funktion als Parameter übergeben.

Wenn Du nun merkst, dass bei ganz viele Funktionen immer einige Parameter identisch sind, dann kannst Du die in eine Klasse zusammenfassen, wo im __init__ die gemeinsamen Parameter übergeben werden und die Methoden dann auf diese zurückgreifen. Bedeutet bei Dir, für jeden API-Key eine eigene Instanz einer Klasse.

Also kann es keine Gründe geben, warum es genau eine Instanz geben muß. Es gibt nur die zwei Alternativen, viele Instanzen oder viele Funktionen ohne Klasse.
Scholastik
User
Beiträge: 53
Registriert: Freitag 7. Juli 2017, 12:35

wie gesagt würde es zu weit führen zu erklären warum es nur eine Helper instanz geben darf (zb speichert sie API antworten als Cache ab und macht nur neue Calls wenn der macher es so wünscht,ansonsten wird cache returned und noch viele weitere dinge).
okay, also habt ihr keine Lösung für das Problem parat, schade :(
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Scholastik: Vielleicht haben wir ja eine Lösung für das Problem das wir nicht kennen. Lässt sich halt nur schlecht sagen. Für das Problem das Du uns hier gezeigt hast, gab es ja Lösungen.

Letztlich ist der Wunsch automagisch den Aufrufer zu ermitteln um daraufhin unterschiedliche Sachen zu machen, keine gute Idee, denn das ist supermagisch und undurchsichtig, weil Du da im Grunde ein Argument versteckst. Was eben besser tatsächlich als Argument übergeben werden sollte. Wobei es auch noch interessant wäre in wie weit das den Rückgabewert beeinflusst, denn das riecht auch ein bisschen komisch, insbesondere wenn je nach Aufrufer komplett unterschiedliche Wege in der Helper-Methode genommen werden, denn dann wären das ja eigentlich mehrere Methoden und nicht eine.

Für den Cache könnte man vielleicht noch eine weitere Klasse einführen – den gemeinsamen Cache für mehrere Helper-Objekte.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Oder direkter: Das die Lösung des Problems ist, kein kaputtes Design zu verwenden.
Antworten