Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse

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

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
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

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
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
  • 2 uker senere...

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...