Objektorientiertes Programmieren Zeit

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ein sehr einfaches Beispiel zu __add__:

Code: Alles auswählen

>>> class GrafZahl(object):
...     def __init__(self, wert):
...         self.wert = wert
...     def __add__(self, andere_zahl):
...         return GrafZahl(self.wert + andere_zahl.wert)
...     def __str__(self):
...         return "GrafZahl: %d" % self.wert
...
>>> x = GrafZahl(23)
>>> y = GrafZahl(42)
>>> print x
GrafZahl: 23
>>> print y
GrafZahl: 42
>>> z = x + y
>>> print z
GrafZahl: 65
Das Leben ist wie ein Tennisball.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

ich habe den eindruck, dass dir noch ein paar grundlagen nicht klar sind.
Verstehst du den Grafzahl?

was ist "self", was tut das?
was ist "andere_zahl" in __add__ bzw was sollte es sinnvollerweise sein?
http://www.kinderpornos.info
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dein `s_to_time()` würde ich ja eher `seconds_to_time()` nennen (möglichst Abkürzungen vermeiden) und gar nichts an den Attributen ändern, sondern einfach eine neue `Time()`-Instanz zurückgeben, die mit h, m, s initialisiert wurde. Wenn man nur die Zeit angezeigt bekommen will, geht in dem Fall ja trotzdem noch ein `print seconds_to_time(1234567890)`, da einfach die `__str__()`-Methode der neuen Instanz aufgerufen wird.
Sconine
User
Beiträge: 49
Registriert: Montag 1. Juni 2009, 11:00

Ich habe das Beispiel Grafzahl verstanden.

self.wert ist bei mir = self.hours, self.minutes, self-seconds
andere_zahl.wert ist bei mir second_time.hours, second_time.minutes, second_time. seconds

Ist es soweit richtig?

Ich muss ja hours und minutes in seconds umrechnen, damit ich doch überhaupt rechnen kann. Da habe ich meine Probleme.
Mit meinen eigenen "Namen" habe ich Probleme. Man ist das peinlich.

Self muss immer vorne in der Klammer stehen. Was es aber genau macht, weiss ich nicht. Ich weiss nur, dass es beim objekorientierten Programmieren wichtig ist.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

`self` repräsentiert die Instanz deiner Klasse. `self.seconds = 60` heißt: "Weise dem Attribut `seconds` der "aktuellen" Klasseninstanz den Wert `60` zu" Die Instanz ist immer das erste Objekt, das den Klassenmethoden übergeben wird.* Man kann es beliebig benennen aber allgemein hat sich `self` eingebürgert und sollte, um Missverständnisse zu vermeiden, auch so übernommen werden.

---

*EDIT: Bevor es zu Missverständnissen kommt, forme ich den Satz besser um: Das erste Objekt, das einer Klassenmethode übergeben wird, ist immer die Instanz der Klasse. Die Instanz ist in der Regel das, was herauskommt, wenn man sie aufruft:

Code: Alles auswählen

>>> class Foo(object):
...     def say_bar(self):
...         return 'bar'
...
>>> Foo.say_bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method say_bar() must be called with Foo instance as first argument (got nothing instead)
>>> Foo().say_bar()
'bar'
Wie du siehst, kann auch auf die (meisten) Methoden einer Klasse erst zugegriffen werden, nachdem man die Klasse aufgerufen (also initialisiert) hat.

Wenn man es sich ganz umständlich machen will, könnte man die geforderte Instanz der Klasse auch so an ihre `foo()`-Methode übergeben:

Code: Alles auswählen

>>> Foo.say_bar(Foo())
'bar'
Das ist aber unüblich und soll nur der Veranschaulichung dienen.
Zuletzt geändert von snafu am Montag 15. Juni 2009, 14:32, insgesamt 2-mal geändert.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

programmieren ist ein handwerk das man lernen muss wie jedes andere auch. wie kommst du auf die idee, dass du das nach ein paar wochen beherrschst? das dauert eben seine zeit.

es ist wichtig, dass du sorgfältig arbeitest und verstehst was vorgeht.
insbesondere solltest du verstehen, was eine klasse ist, was eine instanz ist und was es mit dem "self" auf sich hat.


Code: Alles auswählen

In [2]: class C: #eine Klasse
   ...:     def test(self):
   ...:         print "self: ", self

In [4]: c = C() #c wird eine instanz der klasse C

In [5]: c
Out[5]: <__main__.C instance at 0x0160DB20>

#in self ist die aktuelle instanz gespeichert.
#hast du dich nie gewundert, dass du diesen parameter nicht übergeben musst?
In [6]: c.test() 
self: <__main__.C instance at 0x0160DB20>  

#das kommt daher, dass hier eigentlich etwas in der art passiert:
In [8]: C.test(c)
self: <__main__.C instance at 0x0160DB20>
versuch nochmal meine fragen zu GrafZahl zu beantworten.
http://www.kinderpornos.info
BlackJack

@snafu: Bitte nicht solche Tipps zur Typprüfung geben! Python ist kein Java. Was ist, wenn ich eine `MeineZeit`-Klasse schreibe, die sich richtig verhält, aber nur wegen so einer dusseligen Typprüfung abgeleht wird? Damit macht man sich das "duck typing" kaputt -- eins der Merkmale, warum Python so nett ist.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Stimmt. Man merkt ja, ob das übergebene Objekt eine `in_seconds()`-Methode hat, wenn sie aufgerufen werden soll. Wobei ich das ohnehin als Attribut und nicht als Methode implementieren würde.
Sconine
User
Beiträge: 49
Registriert: Montag 1. Juni 2009, 11:00

Ich habe es versucht nochmal alleine neuzuschreiben:

Code: Alles auswählen

class Zeit:

    def __init__(self,hours=0,minutes=0,seconds=0):

        self.hours = hours
        self.minutes = minutes
        self.seconds = seconds
     
    def in_seconds(self):
        s = self.hours*3600+self.minutes*60+self.seconds
        return s

    def seconds_to_time(self,s):
        h, rests = divmod(s,3600)
        m, s = divmod(rests, 60)
        self.hours, self.minutes, self.seconds = h, m, s
        return Zeit (h, m, s)

    def __add__(self, andere_zeit):
        h, rests = divmod (s, 3600)
        m, s = divmod (rests, 60)
        self.hours, self.minutes, self.seconds = h, m, s
        return Zeit (h, m, s)

    def __str__(self):
        return "%d:%d:%d" % (self.hours, self.minutes, self.seconds) 


meinezeit = Zeit(13, 37, 59)
anderezeit = Zeit(1, 2 ,3)
drittezeit = Zeit()
neuezeit = Zeit()

x = meinezeit
y = anderezeit
z = neuezeit 


print meinezeit.__str__()
print meinezeit.in_seconds()

#neuezeit = x + y
#print z

neuezeit = meinezeit.__str__ + anderezeit.__str__
print neuezeit.__str__

drittezeit.seconds_to_time(4845)
print drittezeit.__str__()
Ich übergebe doch die Werte von meinerzeit und anderezeit an def __add__

meinezeit:
h = 13
m = 37
s= 59

anderezeit:
h = 1
m = 2
s = 3

Was muss ich denn jetzt noch machen, damit endlich damit gerechnet wird?
Ich habe schon einiges versucht, aber ich komme auf keine Lösung.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

du hast immernoch nicht verstanden was andere_zeit überhaupt ist. ein objekt, eine instanz deiner zeit klasse. das musst du dir erstmal klarmachen was das bedeutet und was man damit anfängt. dann kannst du auch die __add__ methode implementieren.
http://www.kinderpornos.info
Sconine
User
Beiträge: 49
Registriert: Montag 1. Juni 2009, 11:00

Wie gesagt, ich kann es nachvollziehen, was bei Grafzahl gemacht wird, aber ich schaffe es einfach nicht in mein Programm einzusetzen!!!

Muss ich schon bei def __add__ bei return meinezeit + anderezeit schreiben oder return h, m, s und unten beim Print schreiben, was er bei __add__ machen soll.

Ich bin echt völlig fertig, so dass ich glaube, dass ich nochnichtmal mehr die Frage richtig formulieren kann.

Ab wo ist denn bei mir der Fehler bei __add__? Vielleicht bringt es mich dann weiter.
Sconine
User
Beiträge: 49
Registriert: Montag 1. Juni 2009, 11:00

Ich sitze jetzt schon den ganzen Tag daran und habe immernoch die Probleme mit __add__

Kann mir einer sagen, was ich da genau falsch mache?
Es kann doch nicht sein, dass die Aufgabe wegen der __add__-Methode scheiter.

Ich gucke mir die ganze Zeit Grafzahl an, aber ich bekomme es bei class Zeit nicht hin. :cry:

Bei meinerzeit werden doch die ersten Werte für h, m, s gegeben.
Bei andererzeit stehen doch die Werte, die mit meinerzeit addiert werden.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Der entscheidende Fehler ist, dass bei dem von dir zuletzt geposteten `__add__()` zwar `andere_zeit` als Argument angenommen aber danach gar nicht verwendet wird. Woher sollen die Attribute dann auch kommen? Du musst die Instanz schon ansprechen...
Antworten