design pattern - memento

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
lelal
User
Beiträge: 2
Registriert: Mittwoch 6. Januar 2010, 15:08

Moin

ich bin schon seit einer Weile dabei so ein Memento Pattern in Python zu machen aber ich komm irgendwie nicht mehr klar. Dass ich das letzte mal irgendetwas programmiert habe ist schon etwas her..

Hier mal das uml:
http://www.dofactory.com/patterns/Diagrams/memento.gif

Ich habe bis jetzt dies:

Code: Alles auswählen

class Originator:
	def __init__(self,state):

    		self.state= state

    	def CreateMemento(self):
        	return Memento(self.state)

	def SetMemento(self,memento):
        	self.state = memento.GetState()

        def hochzaehln(self):
        	self.state+="1"
        	return self.state

class Memento:
	def __init__(self,state):
		self.state = state
	def GetState():
        	return self.state

class Caretaker:
	#def __init__(self,state)
		#self._state = state
	def Create(self,originator):
		originator.CreateMemento()
	def Set(self,originator,memento):
		originator.SetMemento(memento)
	def GetMemento(self,originator):
		return originator.state

auto=Originator("3")
abfrage=Caretaker()
einmemento=abfrage.Create(auto)
#print auto.state
#print abfrage.GetMemento(auto)
auto.hochzaehln()
#print abfrage.GetMemento(auto)
abfrage.Set(auto,einmemento)
print abfrage.GetMemento(auto)
Ich weiss nicht mehr warum ich auto genommen habe?!
Ich wollte nun hinkriegen, dass der Status von auto zuerst 3 ist und ein memento davon erzeugt wird. Dann wird dieser "hochgezaehlt" wobei 31 rauskommt. Danach soll der status von auto durch das memento wieder auf 3 gesetzt werden...

Doch diese Meldung kommt...Ich hoffe das ist das letzte Problem.. :(
------------------------------------------------------------------------------------

Traceback (most recent call last):
File "C:\..\Memento Design
Pattern\mementotest1.py", line 39, in <module>
abfrage.Set(auto,einmemento)
File "C:\..\Memento Design
Pattern\mementotest1.py", line 28, in Set
originator.SetMemento(memento)
File "C:\..\Memento Design
Pattern\mementotest1.py", line 10, in SetMemento
self.state = memento.GetState()
AttributeError: 'NoneType' object has no attribute 'GetState'
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

`einmemento` ist `None`, weil du in `Create` nichts zurückgibst. Ich verstehe allerdings nicht, warum du den Status als String speicherst, willst dafür nicht lieber Integers nutzen? ;-)
lelal
User
Beiträge: 2
Registriert: Mittwoch 6. Januar 2010, 15:08

ah stimmt ^^
jetzt klappts
hatte auch noch das self bei GetState vergessen.
Ja das habe ich eben auch noch geändert mit den integern, wollte aber erstmal schnell die funktionalität haben.
dankeschön ;)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Und wozu brauchst Du Getters und Setters? Ziemlich "unpythonisch" ;-).
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

CM hat geschrieben:Und wozu brauchst Du Getters und Setters? Ziemlich "unpythonisch" ;-).
Das ist das Memento-Pattern ebenfalls ;)
Da das Kernanliegen ja ist "die Kapselung nicht zu verletzen", d.h. den internen State nicht verfuegbar zu machen, greift man mit Python sowieso ins Leere, da Python keine Accessqualifier kennt (zum Glueck).
Antworten