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:

Code: Alles auswählen

def saghallo(self):
	print self.hallo
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:

Code: Alles auswählen

m = mainhallo()
saghallo.saghallo(m)
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

Code: Alles auswählen

return self.hallo
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...