OOP module hell

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
movies1978
User
Beiträge: 15
Registriert: Montag 13. Februar 2006, 13:25

Hallo,
ich habe module geschrieben in dem eine Klasse ist.
modul.py
in der steht

class xyz:
__init__(xyz):
.
.
.

wenn ich nun

from .. import modul
mache und versuche eine Objekt zu instanzieren, dann sagt er mir
AttributeError: module '...module' has no attribute 'xyz'

Gibt es gute ausführliche Tutorials zu diesem Thema?

Mfg
Mathias
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Dein Problem ist massiv unterspezifiziert. Da Du from ... import modul benutzt, gehe ich davon aus, dass Deine modul.py in einem Package liegt, und deswegen sollte das, was Du probierst, eigentlich ohne Probleme tun, außer Du hast einen Namenskonflikt mit einem eigebauten Modul. Bitte poste etwas eindeutigeren und aussagekräftigeren Code.
--- Heiko.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

movies1978 hat geschrieben:Gibt es gute ausführliche Tutorials zu diesem Thema?
Hi Mathias!

http://python.org/doc/2.4.3/tut/node8.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

Also ich bin zwar auch noch nicht so lange dabei, aber wenn ich eine Klasse definiere sieht das folgendermassen aus:

Code: Alles auswählen

class Irgendwas(möglicheOberklasse):
    Klassenattribut = Definition

    def __init__(self, Anzahl übergebener Attribute):
        # und hier werden dann die Objektattribute mit nem Wert belegt
        
        # danach kommen dann die Methodendefinitionen
Nun ja, so in etwas, zumindest die Basis.
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Die Lösung des Problemes liegt doch schon in der Fehlermeldung:

AttributeError: module '...module' has no attribute 'xyz'

die richtige Syntax heißt für deine Fall:

Code: Alles auswählen

from modul import xyz
#oder
from modul import *
#oder
import modul
Python denkt modul wäre die Klasse und sucht nun nach einem Attribut/Methode/Variable xyz in dieses Klasse. Da modul.py nun nicht die Klasse sondern das Modul eben ist kommt die obige Fehlermeldung. du könntest genauso schreiben from dosenkohl import trallala, würde die gleiche Fehlermeldung kommen.

PS: wenn modul.py in einem Unterverzeichnis liegen sollte, brauchst du noch in diesem Unterverzeichnis eine __init__.py mit from modul import * drin und in deinem "aufrufenden" Modul musst du hinter from den Namen des Unterverzeichnisses angeben.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Buell hat geschrieben:eine __init__.py mit from modul import * drin
Falsch. Es kann auch eine leere __init__.py sein. Siehe [wiki]Modul_Import[/wiki].
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

@leonidas

richtig, aber eine leere __init__.py dürfte wahrscheinlich einfach alles importieren und das sollte wohl in den seltensten Fällen gewollt sein.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Buell hat geschrieben:richtig, aber eine leere __init__.py dürfte wahrscheinlich einfach alles importieren
Nein, eine leere __init__.py tut genau das was in ihr drin steht: gar nichts. Sie wird nur gebraucht, um dem Interpreter anzuzeigen, dass das Verzeichnis, in dem sie drin ist, ein Package sein soll.

Aus Python-Tutorial, Kapitel 6.4 Packages zitiert:
Python Tutorial hat geschrieben:In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package
Deswegen würde man es eher so machen (um das zu bekommen, was der OP wollte):
  • einen Ordner, nennen wir ihn mal mytools erstellen
  • in diesen Ordner die Datei modul.py legen
  • in ebendiesem Ordner auch eine leere Datei __init__.py erstellen. touch __init__.py ist genau richtig.
  • Python-Interpreter im Ordner in dem der Ordner mytools drin ist anwerfen
  • Code: Alles auswählen

    from mytools import modul
    et voila!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

... man lernt nie aus...
Antworten