python neuling - code macht unerwartetes :)

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
mze
User
Beiträge: 2
Registriert: Donnerstag 31. Mai 2007, 21:49

hallo,

ich programmiere schon seite mehreren Jahren und habe mir heut mal Python etwas näher angeschaut. Nachdem ich ein bisschen mit der grundlegenden Klassenfunktionalität herumgespielt habe ist mir folgendes aufgefallen.

Code: Alles auswählen

#!/usr/bin/env python

class Solarsystem:
    name    = ''
    planets = []
    
    def __init__(self, name):
        self.name = name
        print 'created solarsystem', name
    
    def addPlanet(self,planet):
        print 'added planet', planet.name, 'to solarsystem', self.name
        self.planets.append(planet)
    
    def listPlanets(self):
        print 'solarsystem', self.name, 'has the following planets:'
        for element in self.planets:
            print element.name
        print '---'

class Planet:
    name    = ''
    nations = []
    
    def __init__(self, name):
        self.name = name
        print 'created planet', name

    def addNation(self, nation):
        print 'added nation', nation.name, 'to planet', self.name
        self.nations.append(nation)

    def listNations(self):
        print 'planet', self.name, 'has the following nations:'
        for element in self.nations:
            print element.name
        print '---'

class Nation:
    name    = ''
    
    def __init__(self, name):
        self.name = name
        print 'created nation', name

# create objects
s1 = Solarsystem('s1')

p1 = Planet('p1')
p2 = Planet('p2')

n1 = Nation('n1')
n2 = Nation('n2')
n3 = Nation('n3')
n4 = Nation('n4')

n5 = Nation('n5')
n6 = Nation('n6')
n7 = Nation('n7')
n8 = Nation('n8')

s1.addPlanet(p1)
s1.addPlanet(p2)

# add objects
p1.addNation(n1)
p1.addNation(n2)
p1.addNation(n3)
p1.addNation(n4)

p2.addNation(n5)
p2.addNation(n6)
p2.addNation(n7)
p2.addNation(n8)

# list objects
s1.listPlanets()
p1.listNations()
p2.listNations()
der hier aufgelistete code produziert folgenden output:

Code: Alles auswählen

created solarsystem s1
created planet p1
created planet p2
created nation n1
created nation n2
created nation n3
created nation n4
created nation n5
created nation n6
created nation n7
created nation n8
added planet p1 to solarsystem s1
added planet p2 to solarsystem s1
added nation n1 to planet p1
added nation n2 to planet p1
added nation n3 to planet p1
added nation n4 to planet p1
added nation n5 to planet p2
added nation n6 to planet p2
added nation n7 to planet p2
added nation n8 to planet p2
solarsystem s1 has the following planets:
p1
p2
---
planet p1 has the following nations:
n1
n2
n3
n4
n5
n6
n7
n8
---
planet p2 has the following nations:
n1
n2
n3
n4
n5
n6
n7
n8
---
seltsamer weise haben beide Planeten alle Nationen zugewiesen bekommen. Habe ich hier etwas grundlegendes übersehen? Danke schonmal im voraus für eure Hilfe.
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Hi und herzlich Willkommen im Forum :)

So sieht das ganze richtig aus.
Variablen werden nicht wie in C++ "außerhalb definiert", scheint als ob sie dann global wären.

Code: Alles auswählen

#!/usr/bin/env python

class Solarsystem:
    def __init__(self, name):
        self.name = name
        self.planets = []
        print 'created solarsystem', name
   
    def addPlanet(self,planet):
        print 'added planet', planet.name, 'to solarsystem', self.name
        self.planets.append(planet)
   
    def listPlanets(self):
        print 'solarsystem', self.name, 'has the following planets:'
        for element in self.planets:
            print element.name
        print '---'

class Planet:
    def __init__(self, name):
        self.name = name
        self.nations = []
        print 'created planet', name

    def addNation(self, nation):
        print 'added nation', nation.name, 'to planet', self.name
        self.nations.append(nation)

    def listNations(self):
        print 'planet', self.name, 'has the following nations:'
        for element in self.nations:
            print element.name
        print '---'

class Nation:
    def __init__(self, name):
        self.name = name
        print 'created nation', name

# create objects
s1 = Solarsystem('s1')

p1 = Planet('p1')
p2 = Planet('p2')

n1 = Nation('n1')
n2 = Nation('n2')
n3 = Nation('n3')
n4 = Nation('n4')

n5 = Nation('n5')
n6 = Nation('n6')
n7 = Nation('n7')
n8 = Nation('n8')

s1.addPlanet(p1)
s1.addPlanet(p2)

# add objects
p1.addNation(n1)
p1.addNation(n2)
p1.addNation(n3)
p1.addNation(n4)

p2.addNation(n5)
p2.addNation(n6)
p2.addNation(n7)
p2.addNation(n8)

# list objects
s1.listPlanets()
p1.listNations()
p2.listNations() 
lgherby
mze
User
Beiträge: 2
Registriert: Donnerstag 31. Mai 2007, 21:49

danke, funzt super. Ich werd mich wohl an so einiges gewöhnen müssen :lol:
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Man gewöhnt sich schneller als man glaubt und hat dann keine Lust mehr eine andere Sprache zu verwenden. Klingt seltsam, ist auch so :D

lgherby
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mze hat geschrieben:Ich werd mich wohl an so einiges gewöhnen müssen :lol:
Naja, so viel ist es nicht, man muss sich nur in Python vom Java-OOP frei machen. Aber PEP 8, den Python Styleguide solltest du schon mal durchlesen und die Funktionen dementsprechend benennen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Wir sollten eine Standard Begrüssung einführen: "PEP 8 lesen".
Das kann man jedem Einsteiger sagen, weil es in keinem Tut, oder Buch (vll ist es in eineigen kA) angesprochen wird.

Aber das Beispiel oben finde ich ja mal genial. So kann man OOP gut darstellen.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

thelittlebug hat geschrieben:Hi und herzlich Willkommen im Forum :)

So sieht das ganze richtig aus.
Variablen werden nicht wie in C++ "außerhalb definiert", scheint als ob sie dann global wären.
das stimmt so nicht ganz.
Variablen, die in der klasse definiert werden, gehören der klasse:

Code: Alles auswählen

class A:
  var = 1

class B:
  var = 2

assert A.var == 1
assert B.var == 2
Wenn du bei einem normalen objekt eine eigenschaft abfragst, wird zuerst das objekt, und dann, wenn das objekt die eigeschaft nicht hat, die klasse gefragt:

Code: Alles auswählen

class X:
  var = 1

obj = X()
assert obj.var == 1 # guckt nach obj.var, dann nach X.var

obj.var = 2

assert obj.var == 2 # nun hat das objekt auch die eigenschaft var...
assert X.var == 1 # ...und sie hat vorrang vor der der Klasse
ich hoffe, das war weder falsch noch verwirrend.[/code]
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Ich hoffe das mir niemand böse ist wenn ich jetzt dezent aussteige :D

lgherby
Antworten