Klassenaufbau für Bilanzkennzahlen ?

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
Benutzeravatar
kaytec
User
Beiträge: 545
Registriert: Dienstag 13. Februar 2007, 21:57

Freitag 21. September 2007, 09:38

Hallo !!

Ich möchte ein Programm zur Kennzahlenberechnung von Bilanzen schreiben und habe mal wieder Probleme mit den Klassen!

Soll die Klasse zur Berechnung der Bilanzkennzahlen eine eigene sein oder ein Teil der Klasse Bilanz.

Bei der Klasse Bilanzkennzahlen übergebe ich immer ein Jahr - oder ist es sinnvoll den ganzen Datensatz zu übergeben ? Dann müsste ich in der Klasse über eine Schleife auf die einzelnen Werte zugreifen. Das bekomme ich aber nicht so hin, da ich dies in der _init_ Zeile machen müsste - oder?

Sollte ich die Klassen ganz anders aufbauen ?

http://ubuntuusers.de/paste/15177/

Ein Datensatz der Klasse Bilanz sieht so aus:

Code: Alles auswählen

[2000, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
[2001, [3, 7, 9, 23, 89, 34, 89, 432, 89, 23]]
[2002, [35, 75, 95, 523, 589, 364, 859, 4352, 589, 423]]
gruß und dank frank
BlackJack

Freitag 21. September 2007, 10:22

IMHO fangen die "Probleme" schon bei den grundlegenden Daten an. Die Datenstruktur ist suboptimal. Die Bilanzdaten wären in `Bilanz` wohl besser in einem Dictionary, das Jahreszahlen auf die Daten des Jahres abbildet, aufgehoben. Und die Daten sollten vielleicht auch besser ein eigenes Objekt statt einer Liste sein, dann spart man sich diese undurchsichtige Indexerei. `berechne_kennzahlen()` ist dann eine Methode auf so einem Jahresobjekt, wenn ich das richtig sehe.
Benutzeravatar
kaytec
User
Beiträge: 545
Registriert: Dienstag 13. Februar 2007, 21:57

Freitag 21. September 2007, 10:46

Danke BlackJack !

Das mit der dict() hate ich schon nur das Sortieren nach aufsteigenden jahreszahlen geht dann natürlch nicht mehr so einfach. Sollte eine dict dann so aussehen:

Code: Alles auswählen

 bilanz_daten = {{2001 :{anlage-vermoegen : 123, gesamt_kapital : 234, ...},
                 {2002 : {anlage..... :456, .....}}
gruß frank
Benutzeravatar
kaytec
User
Beiträge: 545
Registriert: Dienstag 13. Februar 2007, 21:57

Sonntag 23. September 2007, 11:00

Hallo !

Habe es mal mit einer Dictionary versucht.

http://ubuntuusers.de/paste/15255/

Ein Datensatz sieht so aus:
bilanz_daten = {2000, {'Gesamtvermoegen': 3, 'langfristiges Fremdkapital': 5, 'Forderungen': 8, 'Umlaufvermoegen': 1, 'kurzfristiges Fremdkapital': 6, 'Anlagevermoegen': 0, 'Eigenkapital': 3, 'Vorraete': 7, 'fluessige Mittel': 9, 'Fremdkapital': 10}}

gruß frank
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Montag 24. September 2007, 22:29

kaytec hat geschrieben:Das mit der dict() hate ich schon nur das Sortieren nach aufsteigenden jahreszahlen geht dann natürlch nicht mehr so einfach.
Doch:

Code: Alles auswählen

daten={2000: {"foo": "Bla", "bar": 42},
2001: {"foo": "blubb", "bar": 9}}

print sorted(daten.items()) # [(2000, {'foo': 'Bla', 'bar': 42}), (2001, {'foo': 'blubb', 'bar': 9})]
Benutzeravatar
kaytec
User
Beiträge: 545
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 26. September 2007, 21:04

Danke Joghurt !!

Bin schon einige Schritte weiter und jetzt an der graf. Oberfäche. Doch habe ich ein Problem mit dem Layout - Manager grid(). Ich versuche über eine Schleife meine Widgets zu löschen:

Code: Alles auswählen

 for label in self.label_anzeigen:
            label.grid_forget()
Dies funktioniert auch, doch mit der Zeit belastet es den Arbeitsspeicher - gibt es auch eine andere Möglichkeit die Widgets zu löschen ?

gruß frank
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Donnerstag 27. September 2007, 05:24

kaytec hat geschrieben:Habe es mal mit einer Dictionary versucht.

http://ubuntuusers.de/paste/15255/
Hi Kaytec, kurz 3 Sachen die mir zu deinem Paste aufgefallen sind.
  1. Du benutzt '''strings''' zum Dokumentieren. Dokumentieren tut man aber so: # ich bin Dokutext
  2. Du ziehst deinen Quellcode sehr stark auseinander da du sehr viele Leerzeilen drin hast. Wenn du das besser findest, ok. Ich finde aber das der Code dann nicht sehr angenehm zu lesen ist. Siehe zB die größe der letzten for-schleife.
  3. Eine Kleinigkeit: ebenfalls bei der letzten for-Schleife, hatte mich gewundert warum du 2 mal "kennzahlen = dict()" schreibst. Einmal am Anfang der for hätte doch gereicht.
Das zu den Sachen die mir spontan aufgefallen sind.

Gruß Zap
Benutzeravatar
kaytec
User
Beiträge: 545
Registriert: Dienstag 13. Februar 2007, 21:57

Donnerstag 27. September 2007, 08:30

Danke Zap !!!

Ich hatte mal # die verwendet und da wurde mir gesagt besser wären doc- string.
Das mit den Leerzeilen kann sein, doch ich hatte gedacht, dass es mehr Übersicht bringt. Die letzte for -Schleife wird noch grösser, denn ich benötige alle erzeugten Kennzahlen in dem "Hauptprogramm". Die Aufteilung in einzelne Funktionen wäre auch gegangen, doch falls gewünscht kann ich sie mir doch auch aus dem erzeugten Datensatz holen ?! Kennzahlen dict() ist eine Relikt aus der Listenzeit :-).

gruß frank
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

Donnerstag 27. September 2007, 09:01

Kommentare benutzt man eigentlich um Komplizierte stellen im Code zu dokumentieren. Doc-strings nutzt man um Funktionen/klassen zu dokumentieren.


Da wäre es z.B. unpassend Kommentare zu nutzen. Die Beschreibung der Klasse und Funktion packt man besser in doc-strings. So kann man z.B. per `help()` sich in idle oder im script die Beschreibungen ausgeben lassen. Auch Dokumentationswerkzeuge können anhand der doc-strings eine automatische API-Dokumentation generieren.

Code: Alles auswählen

class Spam(object):
    # Diese Klasse stellt eine Dose Spam bereit.
    # ...
    def __init__(self):
        # Beschreibung...
        pass
In diesem Beispiel ist es z.B. unpassend an solchen stellen doc-strings zu verwenden, da kein Mehrwert dadurch ensteht. Sol heißen: `help()` und Dokumentationswerkzeuge können an solchen stellen nichts raus ziehen. Auch wird intern von Python für jeden doc-string speicher angelegt und stellt somit an stellen wo es unnötig ist, eine unnötigen Speicherverbrauch dar (Wenn auch gering).

Code: Alles auswählen

class Spam(object):
    ...
    def open(self):
        """
        Beschreibung der Methode.
        """
        ....
        """Hier passiert was ganz kompliziertes und erfordert einen 
            kurzen aber verständlichen Kommentar."""
Besser:

Code: Alles auswählen

class Spam(object):
    """Diese Klasse stellt eine Dose Spam bereit."""
    def __init__(self):
        """Beschreibung..."""
        pass
    def open(self):
        """
        Beschreibung der Methode.
        """
        ....
        # Hier passiert was ganz kompliziertes und erfordert einen 
        # kurzen aber verständlichen Kommentar.
mfg
Benutzeravatar
kaytec
User
Beiträge: 545
Registriert: Dienstag 13. Februar 2007, 21:57

Samstag 29. September 2007, 19:08

Danke poker !

Habe Deine Hilfestellung noch nicht berücksichtigt - wollte die Oberfläche fertig machen.

Hier ist das Programm:
http://ubuntuusers.de/paste/15475/

gruß frank
Antworten