Grundlagen: Zugriff auf Attribute anderer Klassen...

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
nonsenz
User
Beiträge: 14
Registriert: Montag 23. Januar 2006, 15:40

Hallo zusammen,

ich habe bereits danach gesucht, abre nicht das gefunden was ich brauche.
Folgendes Problem will ich möglichst elegant lösen:

Code: Alles auswählen

class Class1():
    s1 = ''
    x = Class2(s2)

    def __init__(self,s1,s2):
        self.s1 = s1
    
class Class2():
    s2 = ''
    
    def __init__(self,s2):
        self.s2 = s2
    
    def addS1AndS2(self):
        print self.s2 + Class1.s1

a = Class1('foo','bar')
a.x.addS1AndS2()
=> barfoo
Das Beispiel ist etwas schräg, aber ich hoffe es ist nachvollziehbar. Ich möchte innerhalb einer Methode eines Attributes (class2) einer anderen Klasse (class1) auf Attribute der anderen Klasse (class1) zugreifen. Puhh das war jetzt noch verdrehter. Ich könnte da jetzt immer die jeweiligen Attribute von Class1 mit übergeben, aber vielleicht geht das auch anders?

Falls das jetzt jemand verstanden hat, wäre es nett wenn er mit weiterhelfen könnte.
Danke und ciao

nons
Vingdoloras
User
Beiträge: 53
Registriert: Sonntag 2. Dezember 2007, 18:25

Hallo erstmal :D
es würde SEHR dienlich sein, wenn du den Konstruktor (def __init__: und alles was dann in den Block kommt) immer nach GANZ VORNE gleich hinter
class ...:
schreibst, also

Code: Alles auswählen

class Class1():

    def __init__(self,s1,s2):
        self.s1 = s1
        x = Class2(s2)

class Class2():
    
    def __init__(self,s2):
        self.s2 = s2
    
    def addS1AndS2(self):
        print self.s2 + Class1.s1

a = Class1('foo','bar')
a.x.addS1AndS2()
----------------------

Code: Alles auswählen

s1 = ''
die Zeile kannst du weglassen
---

Code: Alles auswählen

s2 = ''
die auch
---

Code: Alles auswählen

x = Class2(s2)
die Zeile hat meiner Meinung nach nichts außerhalb des Konstruktors zu suchen

Das Löschen bzw Zuweisen eines Leerstrings ist unnötig, weil s1 und s2 Parameter sind, die dem Kunstruktor übergeben werden, wenn du eine Instanz erstellst. ( a ist eine Instanz der Klasse Class1 mit den Parametern, die du übergeben hast, sobald du schreibst
"" a = Class1(deine_Parameter) "" )
Wenn die INstanz erstellt wurde, also wenn der Konstruktor durchgelaufen ist, werden diese Parameter gelöscht. Wenn du nun aber in den Konstruktor schreibst "" self.s1 = s1 "", dann wird der Parameter erst in self.s1 abgespeichert, bevor er gelöscht wird, bleibt also unter dem neuen Namen erhalten. Da der alte Name nun weg ist, hat es keinen Sinn, für ihn einen Leerstring einzusetzen.

Ich hab das jetzt mal so geschrieben, in der Annahme, dass noch einige Python-Anfänger das lesen werden, ich habe das durch ein Buch gelernt, aber das ist häufig schwerer als durch ne Erklärung von jemandem, den man dann auch fragen kann ...

Auf jeden Fall weiß ich noch nicht, welches Problem du lösen willst. Was du geschrieben hast, ist ein Algorithmus und ein Algorithmus ist laut Definition eine Lösung für ein Problem. Das Beispiel find ich auch garnicht schräg, aber ich finds interessant :wink:

Bitte folgenden Text nur lesen, wenn jemand versuchen will, meine Gedankengänge zu verstehen, aber ich glaube die sind komplizierter, als das eigentliche Problem^^
Also soweit ich es verstanden habe, ist das Objekt x der Klasse Class1 selbst eine Instanz der klasse Class2
(puh is ja wirklich ein bissl verdreht^^)
und von der Instanz greifst du auf ebendiese zu (self) UND auf die Übergeordnete Instanz der Klasse Class1 ... und nimmst die Methode von a.x also eigentlich eine Methode, die einem Objekt von a(instanz Class1) gehört, aber die Methode ist aus Class2 ... aber Class1 hat nix von Class2 geerbt... aber das is ja nich das besondere...
(haben einzelne Posts ne Zeichenbegrenzung? :twisted: )
die Methode, die der Class2 gehört und, sagen wir mal, von Class1 indirekt geerbt wurde, greift sowohl auf Objekte der Class1 zu, als auch der Class2...

Ich komme zu folgendem Schluss bzw ich habe eine letzte Frage:
WOLLTEST du es auf zwei Klassen aufteilen? Denn es geht einfacher, viel einfacher :D

Code: Alles auswählen

class Class3():
    def __init__(self, s1, s2):
        self.s1 = s1
        self.s2 = s2
    
    def addS1AndS2(self):
        print self.s2 + self.s1

a = Class3('foo','bar')
a.addS1AndS2()
Vingdoloras
User
Beiträge: 53
Registriert: Sonntag 2. Dezember 2007, 18:25

Oh mein Gott is das viel geworden... ich hoffe, du liest dir das durch nonsenz, sonst hab ich alles umsonst geshcrieben :evil: :D :D
BlackJack

@nonsenz: Was willst Du denn *wirklich* machen? Das sieht alles sehr verquer aus.
nonsenz
User
Beiträge: 14
Registriert: Montag 23. Januar 2006, 15:40

wow..! :shock:

also erstmal Danke für die ausführliche Antwort und die Hinweise.
Ich habe das deswegen in verschiedenen Kalssen, weil ich ja versuche halbwegs objektorientiert zu schreiben. Also ich habe da zB einen User und der hat eine Liste von Kursen als Attribut. Auf den einzelnen Kursen kann man nun Methoden aufrufen, die Eingaben verwenden, welche wunderbar in der Userklasse ablegbar währen, um sie nicht immer wieder erneut an die Methoden zu übergeben. Ich möchte sie sozusagen als Eigenschaft des User speichern und dann bei Methodenaufrufen auf den Kursen automatisch einbeziehen.
Hmmm.. Wahrscheinlich macht es doch am meisten Sinn die Eigenschaften beim Aufruf der Methoden zu übergeben. Komisch irgendwie war mir vorhin so als könnte ich das in etwa wie bei superklassen oder so machen. Aber jetzt macht das irgendwie keinen Sinn mehr...
oder doch ?!

ciao
nons
Antworten