Seite 1 von 1
self. und Module?
Verfasst: Donnerstag 26. Februar 2009, 14:21
von gugugs
Wenn ich ein Modul habe, das folgendermaßen aussieht:
und mein Hauptprogramm dann so aussieht:
Code: Alles auswählen
import saghallo
class mainhallo:
def __init__(self):
self.hallo="hallo"
saghallo.saghallo()
Wie kann ich das realisieren? Denn so geht es ja nicht. Also der Zusammenhang zwischen der self Klasse, und einem Modul?
Danke
Verfasst: Donnerstag 26. Februar 2009, 14:29
von cofi
a) Du bindest `saghallo' an `mainhallo':
Code: Alles auswählen
class mainhallo:
def __init__(self):
self.hallo="hallo"
self.saghallo = saghallo.saghallo
self.saghallo()
b)Du übergibst saghallo deine Instanz:
Davon abgesehen ist das ganze ein wenig fragwürdig

Und die Namensgebung unter aller Kanone. Schau dir mal PEP 8 an.
http://www.python.org/dev/peps/pep-0008/
[wiki]PEP 8 (Übersetzung)[/wiki]
Verfasst: Donnerstag 26. Februar 2009, 14:30
von gugugs
Ja ich weiß, wollte nur ein schnelles Prinzip wissen, habe nämlich ein Modul, das sehr viele Variablen von der Klasse benötigt, und da will ich nicht alle übergeben müssen...
Danke
Verfasst: Donnerstag 26. Februar 2009, 14:32
von cofi
Das hört sich nach einem wahnsinnig schlechten Design an. Was zusammengehört sollte man auch zusammen lassen.
Vielleicht erklärst du mal, was du vorhast, dann können wir mal die Ursache statt den Symptomen behandeln

Verfasst: Donnerstag 26. Februar 2009, 14:51
von Leonidas
gugugs hat geschrieben:habe nämlich ein Modul, das sehr viele Variablen von der Klasse benötigt, und da will ich nicht alle übergeben müssen...
Dann übergib doch die Klasse.
Verfasst: Donnerstag 26. Februar 2009, 16:08
von gugugs
OK, wenn ich jetzt z.B. solch ein Modul habe:
Code: Alles auswählen
class klasse_hallo:
def __init__(self):
self.hallo="Sag hallo"
Wie kann ich dann das self.hallo abrufen?
So geht es schon mal nicht:
Code: Alles auswählen
class main:
def __init__(self):
print hallo.klasse_hallo.hallo
Wird wahrscheinlich nicht so schwer sein, aber ich komm nocht drauf...
Verfasst: Donnerstag 26. Februar 2009, 16:21
von cofi
`self.hallo' ist ein Instanzattribut. D.h. du brauchst auch eine Instanz deiner Klasse

Dann jedoch stimmt dein Ansatz.
Das Grundproblem bleibt aber: Wenn du eine so dicht verwobene Architektur hast, dann stimmt etwas nicht. Wenn du aber nicht deine Ziele offenbaren willst: Ruf die Funktionen lieber aus der Klasse auf, statt von den Funktionen (oder von sonst wo) aus in den Instanzdaten herumzufuchteln.
Verfasst: Donnerstag 26. Februar 2009, 16:36
von gugugs
Ich will nicht alles erklären, sonst würde es zu lang dauern, ich habe einfach Modul, in dem bestimmte Dinge erledigt werden, und wo bestimmte Sachen sind, die ich nur ein eineinziges mal woanders brauche. Deshalb, muss ich wissen, wie ich etwas aus einer Klasse aus einem Modul bekomme, also genau wie in diesem Beispiel. Wenn ich es auf die .__dict__ Art mache, muss ich die Funktion vorher noch mals aufrufen, das will ich aber nicht, denn sie wurde ja schon aufgerufen, und alles wurde gesetzt. Deshalb, weiß ich noch nicht so recht, wie ich mir das heraushole.
edit: Dann könnte ich es natürlich noch mit einer Funktion machen, das ich dann
mache, aber das ist finde ich blöd, da man da wieder ein paar Funktionen machen muss
Verfasst: Donnerstag 26. Februar 2009, 16:47
von b.esser-wisser
Falls es darum geht,
eine Klasse auf mehrere Dateien(=Module) zu verteilen, sollte es doch so gehen, oder?
Code: Alles auswählen
import saghallo
class MainHallo(object):
saghallo=saghallo.saghallo
def __init__(self):
self.hallo="hallo"
riesen_hallo = MainHallo()
riesen_hallo.saghallo()
(d.h.
newstyle-Klasse und Klassen-attribut (genaugenommen ~methode, aber der Unterschied ist in python ja relativ klein

)
hth, Jörg
ps.: ich hab einfach dein "saghallo.py" kopiert
Verfasst: Donnerstag 26. Februar 2009, 16:50
von gugugs
das is super, danke, das werd ich mir merken...