FraXinuS Skrevet 20. mars 2006 Del Skrevet 20. mars 2006 Jeg sliter litt med å forstå hvordan classer fungerer. Sliter spesielt med å forstå hva __init__ saken er fornoe og hva som er vitsen med den. Også self som må stå som parameter. Kan noen forklare enkelt hva en class er fornoe og hvordan det funker og hva det brukes til? Lenke til kommentar
zeitgeist Skrevet 21. mars 2006 Del Skrevet 21. mars 2006 Sett at du lager et tekstbasert spill og i det spillet finnes det dører. Disse dørene kan åpnes, lukkes, låses og låses opp. I v2.0 planlegger du at de også kan brytes opp og sprenges. Dette kan f.eks skrives slik: #!/usr/bin/env python # -*- coding: UTF-8 -*- class Door(object): def __init__(self, doorname, state="shut", locked=False): self.doorname = doorname self.state = state self.locked = locked def __repr__(self): return "<A %s door>" % self.doorname def open(self, key=False): """ Hvis dør er låst og nøkkel er ok, lås opp og åpne Hvis dør er ulåst, åpne """ if self.state == 'shut': if self.locked: if not key: print "You need the %s key." % self.doorname else: self.locked = False self.state = "open" print "You unlocked and opened the %s door." % self.doorname else: self.state = "open" print "You opened the %s door." % self.doorname else: print "The %s door is already open." % self.doorname def shut(self): if self.state == 'shut': print "The %s door is already shut." % self.doorname else: self.state = 'shut' print "You shut the %s door." % self.doorname def lock(self, key=False): # sjekk om dør er låst og om nøkkel er ok # ... (Div kode som hånderer logikken) self.shut = True self.locked = True print "You locked the %s door." % self.doorname def unlock(self, key=False): # sjekk om dør er låst og om nøkkel er ok # ... (Div kode som hånderer logikken) self.locked = False print "You un-locked the %s door." % self.doorname # Tester klassen: # Lager to dører med litt forskjeller portal = Door('Portal', locked=True) toilet = Door('Toilet') # Ble de unike? print "portal:", portal print "toilet:", toilet # Åpne portalen print "\n" portal.open() # Opoops, trenger nøkkel portal.open(key=True) # lukk og lås portal.shut() portal.lock() # Åpne toalettet print "\n" toilet.open() # lukke toalettet toilet.shut() Klassen Door fungerer nå som en mal. Du kan lage så mange dører du vil. Jo flere egenskaper du legger til, desto forskjelligere kan de bli. F.eks color=black, wood=True. I v2.0 kan egenskapene "bli brutt opp" og "bli sprengt" enkelt legges til ved å lage metodene "break" og "blowup". __init__ er det som kalles 'constructor'. Det vil si, det er metoden som kalles når objektet lages. Portalen får navn og settes til låst. Toalettet får navn, ellers brukes standardverdiene "state=shut" og "locked=False". self - self gjør objektet unikt. Kikk her for å finne en tutorial: http://www.awaretek.com/tutorials.html Lenke til kommentar
FraXinuS Skrevet 21. mars 2006 Forfatter Del Skrevet 21. mars 2006 Tusen takk, jeg begynner å forstå litt mer nå. Takk for linken, det var mye bra å lese på der. Jeg laget denne: #!/usr/bin/python # Filename: Adressebok.py # Version 1.0 import cPickle addressbookfile = 'addressbook.data' class AddressBook: def __init__(self, name, address): self.name = name self.address = address def AddContact(self): try: f = file(addressbookfile) addressbook = cPickle.load(f) addressbook[self.name] = self.address f.close() f = file(addressbookfile, 'w') cPickle.dump(addressbook, f) f.close() except: addressbook = {} addressbook[self.name] = self.address f = file(addressbookfile, 'a') cPickle.dump(addressbook, f) f.close() def DeleteContact(self): try: f = file(addressbookfile) addressbook = cPickle.load(f) del addressbook[self.name] f.close() f = file(addressbookfile, 'w') cPickle.dump(addressbook, f) f.close() except: print "The address bok has not yet been created. Or the file has been deleted" def SearchContacts(self): try: f = file(addressbookfile) addressbook = cPickle.load(f) if self.name in addressbook: print "%s's address is %s" % (self.name, addressbook[self.name]) except: print "The address book has not yet been created. Or the file has been deleted" def PrintAll(self): try: f = file(addressbookfile) addressbook = cPickle.load(f) print addressbook f.close() except: print "The address book has not yet been created Or the file has been deleted" test = AddressBook('test', '[email protected]') test.AddContact() #test.SearchContacts() #test.PrintAll() #test.DeleteContact() Den er ikke helt ferdig da, skal fise en del på den, men den funker sånn ca. Jeg sleit litt med at når jeg la til en ny kontakt så, ble alt som var i fila skrevet over, men tror det funker nå. Men det ble kanskje ikke helt profft laget. Er det jeg gjorde her en grai måte å gjøre det på eller en den veldig tungvint? Lenke til kommentar
zeitgeist Skrevet 21. mars 2006 Del Skrevet 21. mars 2006 Den er ikke helt ferdig da, skal fise en del på den, men den funker sånn ca. Jeg sleit litt med at når jeg la til en ny kontakt så, ble alt som var i fila skrevet over, men tror det funker nå. Men det ble kanskje ikke helt profft laget. Er det jeg gjorde her en grai måte å gjøre det på eller en den veldig tungvint? 5790293[/snapback] Det ser bra ut! Går da fra å være blank til mekke dette på en dag, så har du full kontroll over helgen!. To ting jeg ville ha vurdert: - Legge alle cPickle.load() og .dump() rutinene in egne metoder, så slipper du å gjenta deg selv. - Ikke bruke generelle excepts, men except KeyError osv. generelle excepts er evil, for da vet du ikke hva som går feil. (Explicit is better than implicit, som det heter ;-)) Lenke til kommentar
FraXinuS Skrevet 22. mars 2006 Forfatter Del Skrevet 22. mars 2006 Ok, så f.eks skal jeg skrive except IOError: print "The file don't exists" er det sånn du mener? Har det noe effekt på programmet eller er det bare for å vise hva som går feil? Skal prøve å se om jeg får cPickle sakene in i en metode på et vis. Lenke til kommentar
zeitgeist Skrevet 22. mars 2006 Del Skrevet 22. mars 2006 Ok, så f.eks skal jeg skrive except IOError: print "The file don't exists" er det sånn du mener? Har det noe effekt på programmet eller er det bare for å vise hva som går feil? Skal prøve å se om jeg får cPickle sakene in i en metode på et vis. 5791361[/snapback] Ja, du kan bruke begge try: ... except KeyError: print ... except IOErrror: print ... Det har ikke noen effekt på programmet. Mer en god vane ;-) Lenke til kommentar
FraXinuS Skrevet 22. mars 2006 Forfatter Del Skrevet 22. mars 2006 Ok, skal prøve å venne meg til det. Lenke til kommentar
FraXinuS Skrevet 31. mars 2006 Forfatter Del Skrevet 31. mars 2006 (endret) glem det fant det ut. Endret 31. mars 2006 av FraXinuS Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå