Seite 1 von 1

design pattern - memento

Verfasst: Mittwoch 6. Januar 2010, 15:50
von lelal
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'

Verfasst: Mittwoch 6. Januar 2010, 16:03
von Dauerbaustelle
`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? ;-)

Verfasst: Mittwoch 6. Januar 2010, 16:20
von lelal
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 ;)

Verfasst: Mittwoch 6. Januar 2010, 16:22
von CM
Und wozu brauchst Du Getters und Setters? Ziemlich "unpythonisch" ;-).

Verfasst: Mittwoch 6. Januar 2010, 19:48
von cofi
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).