Seite 1 von 1
Verwendung von Klassen
Verfasst: Samstag 18. August 2012, 22:16
von Faerelis
Hallo Zusammen,
ich bin gerade dabei Python zu lernen und befasse mich gerade mit Klassen.
Dabei ist mein Frage: wie kann ich es gestalten, wenn ich andere Funktionen aus anderen packages brauche? und...Auf der Seite die ich unten gepostet habe, kann ich, wie ich es verstehe, alle Variablen für die Funktionen definieren, was ist daran falsch wie ich es hier gemacht habe?
Code: Alles auswählen
'''
Depends from time-package the localtime-function
'''
class Date_Time:
# Die Initialisierung
def __init__(self, date, weekday, day, year):
#Das ist mein Sorgenkind, ich weiss nicht ob ich hier das self. brauche, da die Funktion hier nur der Definition dient
self.date = localtime()
self.weekday = date[6]
self.day = date[2]
self.year = date[0]
# Gibt den Wochentag aus/zurück
def weekday(self):
if self.weekday == 0:
return('Monday')
if self.weekday == 1:
return('Thuesday')
if self.weekday == 2:
return('Wednesday')
if self.weekday == 3:
return('Thursday')
if self.weekday == 4:
return('Friday')
if self.weekday == 5:
return('Saturday')
if self.weekday == 6:
return('Sunday')
#Gibt den Tag aus/zurück
def day(self):
return(str(self.day))
# Gibt das Jahr aus/zurück
def year(self):
return(str(self.year))
Ich habe mit
http://www.python-kurs.eu/klassen.php gearbeitet und verstehe leider nicht ganz das Prinzip hinter self bzw der Übergabe/Vererbung. Von daher habe ich mich an diesem selbst erdachten Beispiel versucht, wobei ich nur eine Sammlung von Funktionen haben will die zur Zeit-/Datumsausgabe dienen.
Dank für die Antworten

Re: Verwendung von Klassen
Verfasst: Samstag 18. August 2012, 22:52
von BlackJack
@Faerelis: Vergiss diese Website am besten, das ist kein Python was dort vermittelt wird, sondern irgendeine Sprache die ``private`` und deterministische Destruktoren kennt in Python Syntax verkleidet.
Zu Deinem Quelltext: Die Frage im Kommentar in der `__init__()` verstehe ich nicht‽ Wenn Du die Werte nicht als Attribute an das Exemplar bindest, dann wären es ja nur lokale Namen die am Ende der Funktion nicht mehr existieren.
Ein Eigentor schiesst Du Dir mit den Attributen `weekday`, `day`, und `year` — man kann nicht zwei verschiedene Sachen gleichzeitig an das selbe Attribut binden wollen. Du musst Dich schon entscheiden ob Du darüber die Methoden oder die Zahlenwerte ansprechen möchtest und das jeweils andere entsprechend anders benennen. Wobei die Umwandlung in Zeichenketten sowieso eine komische Schnittstelle ist. Das kann der Benutzer dieser Klasse machen wenn er das benötigt. Oft will der aber vielleicht die Zahlen haben und damit zum Beispiel rechnen, und dann ist eine Zeichenkette mit Ziffern unpraktisch.
Die Argumente und die Zuweisungen in der `__init__()` sind recht wirr und teilweise sinnfrei.
``return`` ist keine Funktion, also schreib diese Anweisung besser nicht Klammern als wenn es eine wäre.
Re: Verwendung von Klassen
Verfasst: Samstag 18. August 2012, 22:56
von cofi
Vergiss die Website und benutze das offizielle Tutorial, in meiner Signatur ist die Uebersetzung verlinkt.
Zu deinem Problem: Wie sonst auch.
Was dich verwirrt ist das `self`, das ist aber kein magischer Name und koennte auch `ego` heissen. Der Zweck von `self` ist, dass man auf das Exemplar zugreifen kann. Willst du auf das Exemplar, seine Daten oder Methoden zugreifen?
Nein, du willst eine Funktion aufrufen.
Was du hier mit "Definition" meinst verstehe ich nicht, aber ich kann dir sagen, dass du falsch liegst: Es gibt hier keine Magie.
Die Klammern bei `return` solltest du weglassen, `return` ist keine Funktion, sondern eine Anweisung.
`weekday` laesst sich einfacher schreiben:
Code: Alles auswählen
def weekday(self):
return ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][self.weekday]
Und ich denke in `__init__` laeuft einiges falsch. `Date_Time` nimmt bei dir 4 Argumente entgegen, du benutzt aber nur eines davon und ich denke, dass du an der Stelle eigentlich `self.date` statt `date` benutzen willst.
Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 00:36
von Faerelis
@BlackJack
localtime kommt aus dem time package; Wenn ich den funktionsaufruf time.localtime() innerhalb einer Klasse verwende, muss ich sie dann nicht an die Klasse übergeben?
Und danke für die Hinweise von euch beiden.
Es reicht also aus wenn ich __init__(self): definiere?
aber ich muss date = localtime ja auch irgendwie einbinden, damit die nachfolgenden...Definitionen... es verwenden können, also muss das doch da rein ?
Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 00:45
von Faerelis
@cofi
Ich wär dir sehr verbunden wenn du mir deine Verbesserung mal kurz erklären könntest. Mir ging es darum, dass ich beim entsprechenden Tag du die if-verzweigung den passenden Wochentag zurückgeben kann, aber wie funktioniert das hier?
Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 00:51
von Hyperion
Faerelis hat geschrieben:
localtime kommt aus dem time package; Wenn ich den funktionsaufruf time.localtime() innerhalb einer Klasse verwende, muss ich sie dann nicht an die Klasse übergeben?
Kapiere ich nicht! Inwiefern übergeben? Du kannst eine Funktion aus einer Methode aufrufen, genauso wie aus einer Funktion heraus - die Klasse muss nichts wissen von / über die Funktion.
@Verbesserung: Das sind absolute Grundlagen von Python, nämlich Listen und deren API. Über einen Indexzugriff (`weekday`) wird das zugehörige Element ausgewählt.
Du solltest wohl besser mal ein gutes Tutorial durcharbeiten, bevor Du Dich an Klassen wagst - das offizielle wurde Dir ja schon empfohlen. Wenn Du die grundlegenden Datenstrukturen noch nicht kennst, dann solltest Du erst einmal diese erlernen.
Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 00:57
von Faerelis
Code: Alles auswählen
class Date_Time:
def __init__(self):
self.date = time.localtime()
self.weekday = self.date[6]
self.day = self.date[2]
self.year = self.date[0]
def weekday(self):
return ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][self.weekday]
def day(self):
return(str(self.day))
def year(self):
return(str(self.year))
Das ist meine neue Version, was ist daran nicht io?

Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 01:03
von Hyperion
Faerelis hat geschrieben:
Das ist meine neue Version, was ist daran nicht io?

Willst Du Code-Kritik oder gibt es einen Fehler? Im letzterem Falle poste die Fehlermeldung und / oder beschreibe, was Du erwartest und was tatsächlich eintritt.
Generell solltest Du auf Gegenfragen eingehen - das macht einen besseren Eindruck

Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 01:22
von cofi
Dann solltest du noch auf BlackJack eingehen:
Code: Alles auswählen
In [1]: import time
In [2]: %paste
class Date_Time:
def __init__(self):
self.date = time.localtime()
self.weekday = self.date[6]
self.day = self.date[2]
self.year = self.date[0]
def weekday(self):
return ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][self.weekday]
def day(self):
return(str(self.day))
def year(self):
return(str(self.year))
## -- End pasted text --
In [3]: dt = Date_Time()
In [4]: dt.weekday()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-dae94c1f72b2> in <module>()
----> 1 dt.weekday()
TypeError: 'int' object is not callable
In [5]: dt.day()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-a29edb4d39bf> in <module>()
----> 1 dt.day()
TypeError: 'int' object is not callable
Die Klammern bei `return` sind immernoch ueberfluessig und `Date_Time` sollte nach PEP8 `DateTime` heissen.
Zur Erklaerund der Verbesserung solltest du dir einfach den Interpreter schnappen und es ausprobieren, wenn es dir noch nicht klar ist.
Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 10:45
von Faerelis
Das ist für mich noch nicht so ganz klar alles, anscheinend (nach euch) kann man mit der Seite (s.o.) nicht arbeiten; muss ich mir was Neues suchen.
Ich schau mir das mal alles an, aber erstmal dicken Dank an euch

Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 10:52
von Hyperion
Faerelis hat geschrieben:Das ist für mich noch nicht so ganz klar alles,
Was denn *genau*? Du musst lernen, präziser zu werden; das ist fürs Programmieren in jeder Hinsicht wichtig
Da verschiedene Aspekte von BlackJack, cofi und mir angesprochen wurden, reicht ein "das" nicht aus - wenn Du wirklich *alles* meinst, dann fehlt mindestens diese Ergänzung

Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 21:00
von Faerelis
Also zum einen wollte ich wissen ob das aussreicht wie es hier steht
Code: Alles auswählen
...
def __init__(self):
self.date = time.localtime()
...
Innerhalb der __init__-Funktion rufe ich time.localtime() auf, ist das auch dann gleich von self.weekday/day/year nutzbar? da diese Funktion ja benötigt wird damit die folgenden 3 Zeilen funktionieren.
Zum anderen verstehe ich nicht ganz was es mit
Code: Alles auswählen
def weekday(self):
return ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][self.weekday]
auf sich hat. Ich hatte versucht mit if-Verzweigungen die Tage aus-/zurückzugeben, aber hier kann ich keine Verzweigung erAlso zum einen wollte ich wissen ob das aussreicht wie es hier steht
Code: Alles auswählen
...
def __init__(self):
self.date = time.localtime()
...
Innerhalb der __init__-Funktion rufe ich time.localtime() auf, ist das auch dann gleich von self.weekday/day/year nutzbar? da diese Funktion ja benötigt wird damit die folgenden 3 Zeilen funktionieren.
Zum anderen verstehe ich nicht ganz was es mit
Code: Alles auswählen
def weekday(self):
return ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][self.weekday]
auf sich hat. Ich hatte versucht mit if-Verzweigungen die Tage aus-/zurückzugeben, aber hier kann ich keine Verzweigung erkennen, wie wird das hier erledigt mit dem Code?
kennen, wie wird das hier erledigt mit dem Code?
Eine Verständinsfrage: alles was in __init__ definiert wird, wird mit dem self-Argument übergeben?
Ich taste mich mal ran (auch mit der genauen Fragestellung

Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 21:35
von BlackJack
@Faerelis: Nachdem Du ein Attribut an einen Wert gebunden hast, kannst Du auf den Wert über das Attribut auch zugreifen. Ich frage mich wie man sich diese Frage stellen kann, beziehungsweise wenn man sich diese Frage stellt ist das doch mit ein bisschen Quelltext schneller ausprobiert als in einem Forum zu fragen und verhältnismässig lange auf die Antwort warten zu müssen.
Die `weekday()`-Methode wurde doch schon erklärt. Das sind ganz grundlegende Listenoperationen. Wenn Du noch nie eine (literale) Liste gesehen hast und das man da mit einem Index auf die einzelnen Elemente zugreifen kann, solltest Du Dich erst einmal mit Listen und noch nicht mit Klassen beschäftigen.
Deine Verständnisfrage verstehe ich nicht. Wo wird da etwas mit `self` übergeben? Das Wort „übergeben” impliziert einen Aufruf. Mit `self`?
Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 22:25
von Faerelis
Also das mit dem "sich auseinandersetzen" ist immer so eine Sache, "impliziert" selbiges nicht die Tatsache dass ein Tut vorhanden ist mit dem man arbeiten kann? ich denke da mal so an "...Vergiss diese Website am besten..."... .
Aber ich habe hier trotzdem was gelernt, danke, auch wenns nicht genau der Überschrift entspricht.
Re: Verwendung von Klassen
Verfasst: Sonntag 19. August 2012, 22:33
von EyDu
Faerelis hat geschrieben:Also das mit dem "sich auseinandersetzen" ist immer so eine Sache, "impliziert" selbiges nicht die Tatsache dass ein Tut vorhanden ist mit dem man arbeiten kann? ich denke da mal so an "...Vergiss diese Website am besten..."... .
Du hast den ersten Beitrag von cofi gelesen?