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

OOP module hell

Beitragvon movies1978 » Dienstag 18. April 2006, 10:19

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:

Beitragvon modelnine » Dienstag 18. April 2006, 10:41

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: OOP module hell

Beitragvon gerold » Dienstag 18. April 2006, 10:42

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

Beitragvon prof_weirdo » Dienstag 18. April 2006, 10:45

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

Beitragvon Buell » Dienstag 18. April 2006, 15:56

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 18. April 2006, 16:01

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 Modvoice
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Beitragvon Buell » Dienstag 18. April 2006, 19:38

@leonidas

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

Beitragvon Leonidas » Dienstag 18. April 2006, 20:41

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 Modvoice
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Beitragvon Buell » Mittwoch 19. April 2006, 13:18

... man lernt nie aus...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder