Kann den Fehler nicht finden

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
Wotan
User
Beiträge: 1
Registriert: Donnerstag 29. März 2007, 21:08

Donnerstag 29. März 2007, 21:46

Habe folgende Module:

CSong.py

Code: Alles auswählen

class CSong(object):

    __slots__ = ['__title']

    def __init__ (self, title=None):
        self.__title = title
CRecord.py

Code: Alles auswählen

from CSong import *

class CRecord(object):

    __slots__ = ['__songlist']
    
    def __init__ (self):
        self.__songlist = []
        
    def addSong(self, title):
        S=CSong(title)
        self.__songlist.append(S)
test.py

Code: Alles auswählen

from CSong import *
from CRecord import *

r=CRecord()

r.addSong("song1")
Beim Run des test.py-Moduls ist in der Shell folgende Fehlerausgabe zu lesen:
Traceback (most recent call last):
File "C:\test.py", line 6, in -toplevel-
r.addSong("song1")
File "C:\CRecord.py", line 11, in addSong
S=CSong(title)
NameError: global name 'CSong' is not defined
Könntet ihr mir bitte sagen was ich falsch mache?
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Donnerstag 29. März 2007, 23:11

Hallo und willkommen im Python-Forum.

Bisher sieht dein Quelltext eigentlich okay aus. Macht es denn einen Unterschied, wenn du CSong direkt importierst...

also:

Code: Alles auswählen

from CSong import CSong
?

MfG
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
BlackJack

Freitag 30. März 2007, 11:09

Hat nichts mit dem Problem zu tun, aber der Quelltext sieht extrem unpythonisch aus. Das sieht aus als wenn eine "Discipline & Bondage"-Sprache in Python nachgebaut werden soll.

`__slots__` sind dazu gedacht um Speicherplatz zu sparen wenn man von einem Typen wirklich *viele* Objekte erzeugt und nicht um unveränderliche Attribute zu bekommen.

Der doppelte Unterstrich soll Namenskollisionen bei tiefer Vererbung oder Mixins verhindern und kein Ersatz für ``private`` sein. Dazu reicht ein einfacher Unterstrich, damit andere wissen das es sich um Interna handelt.

Und dann wäre da noch die Namensgebung: Ein "C" um Klassennamen zu kennzeichnen ist überflüssig. Das es sich um eine Klasse handelt, erkennt man schon daran, dass der erste Buchstabe gross geschrieben ist.

Der Style Guide empfiehlt kleine_worte_mit_unterstrichen als Attributnahmen. (Methoden sind auch Attribute)

Sternchenimports sind böse. Man holt sich damit alles aus einem anderen Modul in den aktuellen Namensraum. Wenn das importierte Modul seinerseits Sternchenimports gemacht hat, dann holt man sich transitiv auch das alles mit in den Namensraum. Damit wird die Trennung nahezu komplett aufgehoben und der Sinn von Modulen wird unterlaufen.

Die beiden Klassen hätte man auch prima in einem Modul unterbringen können, da sie thematisch sehr eng verwandt sind.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Freitag 30. März 2007, 11:59

@Blackjack: *rechtgeb*
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 30. März 2007, 17:46

BlackJack hat geschrieben:Hat nichts mit dem Problem zu tun, aber der Quelltext sieht extrem unpythonisch aus. Das sieht aus als wenn eine "Discipline & Bondage"-Sprache in Python nachgebaut werden soll.
Um genau zu sein erinnert dies Beispiel extrem an Java, wo in einer Java-Dati genau eine Klasse ist. An sich wundert es mich, warum die das so machen, denn wirklich zusätzliche übersicht bringt das nicht - bei kleineren Sachen verstreut es den Quellcode nur unnötig. Da ist es IMHO besser wenn man dem Programmierer mehr Freiheiten lässt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Freitag 30. März 2007, 20:09

Leonidas hat geschrieben:
BlackJack hat geschrieben:[...]eine "Discipline & Bondage"-Sprache[...]
Um genau zu sein erinnert dies Beispiel extrem an Java[...]
Ich bin mir sicher, ihr meint dasselbe :wink:
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Dienstag 3. April 2007, 09:26

Hmm, mal abgesehen von den Style-Fragen entdecke ich keinen Fehler, bei mir läufts..
Antworten