Import von Classen - aktuelle Version?

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
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

Freitag 4. Juni 2010, 09:51

Hallo Zusammen,

ich hab folgendes Problem. Ich habe mir eben eine Klasse geschrieben und das ganze in einer Datei auto.py abgespeichert.

Code: Alles auswählen

class auto:
	def __init__(self):
		self.velocity = []
		self.acc = []
		self.pos = []
		
	def changeacc(self, x):
		self.acc = x
	
	def changepos(self, x):
		self.pos = x
		
	def changevelocity(self, x):
		self.velocity = x
		
	def test(self)
		print "test"
In meiner main.py will ich jetzt die Klasse aufrufen. Daher schaut die wie folgt aus:

Code: Alles auswählen

from auto import *

tollesauto = auto()
tollesauto.changeacc(20)
print tollesauto.acc

tollesauto.changevelocity(55)
print tollesauto.velocity

tollesauto.changepos(40)
print tollesauto.pos
Ich starte meine main.py dann mit dem Befehl "run main.py" in meiner pylab console. Mein Problem ist jetzt. Wenn ich meine Klasse auto veraender und zum Beispiel eine neue methode oder ein attribut hinzufuege, kann ich in der main.py nicht drauf zugreifen, da irgendwie nur die alte Version von auto verwendet wird. Nach dem Aendern der Classe hab ich selbstverstaendlich mit "run main.py" die main.py neu ausgefuehrt, die methode ist aber immer noch nicht da. Ist sicher nen standard noob fehler was ich da mach ;)

P.S.: auto.py und main.py liegen auch im selben ordner
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 4. Juni 2010, 10:00

Ich kenne pylab nun nicht, aber vermutlich merkt der sich imports.

Führ das Script doch mal in einer normalen (Dos-)Shell aus. Wie man so etwas macht, steht hier:
http://wiki.python-forum.de/FAQ#Wie_sta ... Skripte.3F

Ein paar Kommentare noch zum Code:

*-Importe sollte man grundsätzlich unterlassen. Du willst die Klasse auto importieren? Dann schreib das doch hin!

Code: Alles auswählen

from auto import auto
Laut PEP8 nutzt man für Klassen CamelCase; man schreibt die Namen vorne also auf jeden Fall groß.

Bei Python 2.x solltest Du die Klasse von object erben lassen.

Die meisten Methoden sind obsolet, weil es nur verkappte setter sind. Du kannst die Attribute auch ohne Methode ändern.

Anstelle der test()-Methode solltest Du die __str__() oder __repr__() Methoden implementieren. Diese dienen dazu, ein Objekt zu "printen".

Wozu willst Du eigentlich die Klasse in ein extra Modul auslagern? Ist das nur eine prinzipielle Übung oder steckt da "Unwissenheit" dahinter? Du darfst und sollst in Python sogar zusammenhängende Dinge in dasselbe Modul schreiben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Freitag 4. Juni 2010, 10:06

nebenbei: dein __init__ ist auch sehr verwirrend, wieso sind hier die Attribute Listen und später von anderem Typ?
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Freitag 4. Juni 2010, 10:21

Ja, das liegt daran, dass der 'run'-Befehl, alle Namen in die Konsole lädt. Aus der Dokumentation von 'run':
This is similar to running at a system prompt:
$ python file args
but with the advantage of giving you IPython's tracebacks, and of
loading all variables into your interactive namespace for further use
(unless -p is used, see below).
Du musst dein Automodul mit 'reload' neu laden.

Grüße
Gerrit
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Freitag 4. Juni 2010, 10:22

Ich meine mich dunkel daran erinnern zu koennen, dass es in Pylab ein reload gibt, mit dem du das Modul neu laden kannst.

EDIT: He cool, das neue PHBB warnt mich, dass jemand anderes geantwortet hat! gkuhl war schneller. :)
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

Freitag 4. Juni 2010, 10:29

danke fuer die infos das der Code nicht erste Sahne ist war mir klar ;) da standen auch ganz andere sachen, fuer die Problemerklaerung aber hab ich das ganze schnell fuer autos geschrieben. Danke aber trotztdem fuer die Hinweise. Die Information ueber die "korrekte" Bennenung von Classen war mir jetzt zum Beispiel noch nicht so bekannt.

Zum Problem: Anscheinend ist das ja dann doch net so einfach zu loesen. Auf das "reload" wuerde ich naemlich gerne verzichten, da wenn ich erstmal 6-7 module drin sind, ich die ja immer neu laden muesste.

Wie macht ihr das eigentlich so normalerweise? Module einzufuegen ist ja nicht irgend eine seltenheit oder :)


EDIT: Kann mir jemand erklaeren wie ich den reload command einbinde? ich bekomme nur fehler;;;
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Freitag 4. Juni 2010, 10:46

Pretender2k hat geschrieben:Wie macht ihr das eigentlich so normalerweise? Module einzufuegen ist ja nicht irgend eine seltenheit oder :)
Wenn ich mehr tue als mal eben was auszuprobieren, dann starte ich mein Programm direkt aus der Konsole und nicht aus dem (oder irgendeiner Variante des) Python-Interpreter(s).
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

Freitag 4. Juni 2010, 10:49

na gut ;)
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Freitag 4. Juni 2010, 11:32

iPython kennt noch 'dreload', das rekursiv alle Module nachlädt. Leider führt es im Zusammenhang mit 'numpy' zu einem ImportError.
Antworten