Seite 1 von 2

Leere Argumente, Default Argumente

Verfasst: Freitag 19. März 2021, 18:48
von TobiM
Hallo Zusammen,

ich habe folgenden Code:

Code: Alles auswählen

class Class1():
    
    def addition(x,y):
        return x+y
    
class Class2():
    
    def addition(x,y,z):
        return x+y+z
    
class Class3():
    
    def function(Class,x,y,z):
        return Class.addition(x,y,z)
        
Ich möchte die Class3 so schreiben, dass je nach der den Eingabeargumenten entweder die Class1 oder Class1 mit addition() aufgerufen wird.
Das Funktion so auch prima für Class2, allerdings nicht bei Class1 da ein Argument fehlt.

Folgender Aufruf funktioniert nicht:

Code: Alles auswählen

print(Class3.function(Class1,1,1))
Es wird folgender Fehler ausgegeben:

Code: Alles auswählen

TypeError: function() missing 1 required positional argument: 'z'
Wie kann ich dieses Problem fixen ?

Liebe Grüße
TobiM

Re: Leere Argumente, Default Argumente

Verfasst: Freitag 19. März 2021, 19:08
von __blackjack__
@TobiM: Bitte richtigen Code zeigen, nicht irgend etwas. Oder falls das tatsächlich der echte Code sein sollte: Lern den Umgang mit Klassen, denn man will ziemlich sicher keine Funktionen in Klassen haben und das erste Argument anders als `self` nennen.

Re: Leere Argumente, Default Argumente

Verfasst: Freitag 19. März 2021, 20:10
von TobiM
Hallo,

Ich komme von Java und konnte mich mit self noch nicht so richtig anfreunden.

Der "echte" Code is zu unübersichtlich, weshalb ich einige Attribute gelöscht habe und das ganze einwenig reduziert habe. Das Problem und der Fehler bleibt der gleiche.

Die Funktion im echten Code ist __init__() und hat bei den beiden Klassen eine unterschiedliche Anzahl an Argumenten.

Re: Leere Argumente, Default Argumente

Verfasst: Freitag 19. März 2021, 21:25
von __blackjack__
@TobiM: Was heisst Du konntest Dich mit `self` noch nicht ”anfreunden”? Ohne `self` sind Deine Klassen keine Klassen sondern einfach nur missbräuchliche Verwendung als Namensraum für Funktionen. Da fragt man sich ja fast ob Du in Java auch versuchst etwas anderes als Java zu programmieren.

Dein Code muss mindestens mal so echt werden dass man an dem sinnvoll das Problem nachvollziehen kann. Du hast da momentan drei Klassen die keine Klassen sind. Die kann man da problemlos aus dem Code raus streichen weil es bei dem Beispiel nur unnötige Indirektionen sind, die mit der Ausnahme nichts zu tun haben.

Re: Leere Argumente, Default Argumente

Verfasst: Freitag 19. März 2021, 22:58
von TobiM
Alles klar dann versuch ichs so nochmal :

Code: Alles auswählen

class Mensch():
    name = ''
    alter = 0
    def __init__(self, name,  alter):
           self.name = name
           self.alter = alter
           
              
class Angestellter(Mensch):
    firma =''
    
    def __init__(self, name, alter, firma):
           self.name = name
           self.alter = alter
           self.firma = firma
    
 def initialisieren(Klasse, name, alter, firma)
        obj = Klasse(name, alter, firma)
        return obj
 
Mit der Funktion initialisieren() möchte ich eine der beiden Klassen initialisieren und dieses Objekt zurückgeben.

Möchte ich nun Angestellter initialisieren, so funktioniert dies, bei Mensch bekomme ich den Fehler von oben, dass eine Angabe fehlt.

Das passt jetzt hoffentlich so, dass man mein Problem versteht.

Re: Leere Argumente, Default Argumente

Verfasst: Freitag 19. März 2021, 23:19
von Dennis89
Hallo,

wenn du die Funktion 'initialisieren' so wie sie da steht aufrufst, dann musst du alle vier Argumente übergeben. Dann rufst du deine Klasse 'Mensch' entweder mit drei Argumenten auf, obwohl die Klasse nur zwei Argumente benötigt, oder du übergibst nur zwei Argumente obwohl der Aufruf drei Argumente erwartet. In beiden Fällen erhälst du logischerweise eine Fehlermeldung.

Grüße
Dennis

Re: Leere Argumente, Default Argumente

Verfasst: Freitag 19. März 2021, 23:49
von pillmuncher
@TobiM: Du musst schon Python als Python akzeptieren, statt zu versuchen, daraus ein Java mit leicht anderer Syntax zu machen. Attribute, die auf Klassenebene definiert werden, sind Klassenatribute. In deinem Beispiel würde das etwa dazu führen, dass alle Menschen denselben Namen haben. Wenn du Instanzvariablen willst, also dass verschiedene Menschen auch verschiedene Namen haben können, dann solltest du das in der __init__() Methode machen, indem du zB. den gewünschten Namen an self.name bindest, wie du es ja eh schon tust. Fragt sich, warum du das im Namensraum der Klasse nochmal machst.

Re: Leere Argumente, Default Argumente

Verfasst: Freitag 19. März 2021, 23:50
von TobiM
@Dennis ganz genau, aber wie kann ich das beheben ?

Ich möchte der Funktioniert initialisieren() auch nur 2 Argumente übergeben können und damit eine Instanz von Mensch erzeugen können.

Bzw. auch nur ein Argument übergeben und so beide initialisieren. Ich kann man fehlende Argumente "ignorieren" ?

Re: Leere Argumente, Default Argumente

Verfasst: Samstag 20. März 2021, 00:00
von TobiM
@pillmuncher habe ich das nicht gemacht ?
Wenn man den Konstruktor von Mensch aufruft wird doch ein neuer name festgelegt ?!

Code: Alles auswählen

class Mensch():
    name = ''
    alter = 0
    def __init__(self, name,  alter):
           self.name = name
           self.alter = alter

Re: Leere Argumente, Default Argumente

Verfasst: Samstag 20. März 2021, 00:19
von pillmuncher
TobiM hat geschrieben:
Samstag 20. März 2021, 00:00
@pillmuncher habe ich das nicht gemacht ?
Ja, hast du. Aber was meinst du, machen diese Zeilen auf Klassenebene?

Code: Alles auswählen

    name = ''
    alter = 0

Re: Leere Argumente, Default Argumente

Verfasst: Samstag 20. März 2021, 00:31
von __blackjack__
@TobiM: Du weisst doch an der Stelle wo Du `initialisieren()` aufrufst sowohl welche Klasse Du am Ende haben willst, denn die übergibst Du ja, als auch das Du bei Mensch ein Argument weniger hast, also ist die Frage warum Du nicht gleich die richtige Klasse mit den Argumenten aufrufst die Du hast und die zu der Klasse passen.

Beschreibe doch mal welches *Problem* hier eigentlich gelöst werden soll und nicht welche Probleme Du mit einer Lösung hast. Vielleicht wollen die Probleme mit dieser Lösung Dir ja auch sagen das die Lösung keine (gute) Lösung für das eigentliche Problem ist.

Wobei ich durch Deine anderen Themen schon den verdacht habe das es an sich schon keine gute Idee war das ganze in eine statische Klassenhierarchie giessen zu wollen.

Re: Leere Argumente, Default Argumente

Verfasst: Samstag 20. März 2021, 00:36
von TobiM
@pillmuncher

Ich denke mal nichts ??
Sobald man eine Instanz erzeugt werden die Attribute überschrieben oder sehe ich das falsch ?

Re: Leere Argumente, Default Argumente

Verfasst: Samstag 20. März 2021, 01:00
von TobiM
@pillmuncher ich habe das Problem verstanden. Ich habe hier Klassen- mit Objektvariabeln vertauscht, dachte man muss die Attribute iwie zuerst initialisieren, aber das macht kein Sinn und muss weg.


@__blackjack__ mein eigentliches Problem besteht darin, dass ich eine Datenbank habe die mittels ORM mit einer statischen Klassenhierarchie verbunden ist. In die Datenbank möchte ich nun Instanzen verschiedener Klassen schreiben, dazu habe ich eine Funktion add(), die ein Datentyp (Klasse) und die entsprechenden Attribute nimmt und daraus einen Eintrag erstellen soll. Solange alle Klassen die gleiche Anzahl an Attributen haben klappt dass, allerdings nicht wenn die Anzahl wie oben abweicht.

Ich hätte dazu gerne eine Funktion add(Klasse, arg1,arg2,arg3,...) die eine Instanz einer beliebigen Klasse in die Datenbank schreibt, ohne mich auf einen Datentyp/Klasse festlegen zu müssen. Dabei wird natürlich ein Fehler bei Zuviel Input ausgegeben, allerdings soll bei Zuwenig Input leere Felder bzw. default Werte verwendet werden.

Mit der oberen Struktur will ich mir, durch die Klassen, neue Datentypen für Objekte erschaffen, die ich dann in einer Datenbank ablege. Bei der weiteren Verarbeitung erhoffe ich mir durch die Klassenstruktur eine einfacheres Handling.

Ich hoffe, dass hilft nun weiter.

Re: Leere Argumente, Default Argumente

Verfasst: Samstag 20. März 2021, 07:17
von kbr
@TobiM: was Du eigentlich möchtest, ist eine save-Methode auf den Klassen. Wenn Du ein ORM verwendest, sollten Dir die passenden Klassen bereits zur Verfügung stehen.

Re: Leere Argumente, Default Argumente

Verfasst: Samstag 20. März 2021, 09:26
von TobiM
@kbr ja genau, allerdings habe ich ja dann wieder das gleiche Problem, dass bei verschiedenen Klassen, bei denen die Anzahl der Attribute nicht übereinst ein Fehler geworfen wir.
Gibt es da keinen Formalisnus sowas zu ignorieren?