self. und Module?

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
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Donnerstag 26. Februar 2009, 14:21

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
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Donnerstag 26. Februar 2009, 14:29

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]
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Donnerstag 26. Februar 2009, 14:30

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
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Donnerstag 26. Februar 2009, 14:32

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

Donnerstag 26. Februar 2009, 14:51

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Donnerstag 26. Februar 2009, 16:08

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...
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Donnerstag 26. Februar 2009, 16:21

`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.
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Donnerstag 26. Februar 2009, 16:36

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
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Donnerstag 26. Februar 2009, 16:47

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Donnerstag 26. Februar 2009, 16:50

das is super, danke, das werd ich mir merken...
Antworten