self
som
används för att komma åt de egna attributen
class Klassnamn(object):
följt av en indenterad samling metoder.
class Bok(object): def __init__(self, titel, forfattare, utg, isbn = "-"): self.titel = titel self.forfattare = forfattare self.utg = utg self.isbn = isbn |
__init__
definierar vi objektets
attribut och ger dom värden. Här är attributen:
self.titel self.forfattare self.utg self.isbnNär vi vill skapa ett Bok-objekt skickar vi in värden till de fyra parametrarna titel, forfattare, utg och isbn.
godnattsaga
en referens till det nyskapade Bok-objektet.
godnattsaga = Bok("The BFG", "Roald Dahl", 1982, "0-224-02040-4") |
kursbok = Bok("Pythonkramaren II", "Henrik Eriksson", 2010) |
def byt_isbn(self, isbn): self.isbn = isbn def visa_titel(self): print self.titel def hur_gammal(self): ar = 2011 - self.utg return ar |
objekt.metod()
kursbok.visa_titel() |
class Husdjur(object): """ Ett virtuellt husdjur """ def __init__(self, djurnamn): """Konstruktorn, initierar attributen namn, glad och hunger.""" self.namn = djurnamn self.glad = 0 self.hunger = 0 def visaStatus(self): """Visar husdjurets namn och hur det mår.""" print "\n", self.namn, "är", if self.glad > 0 and self.hunger < 3: print "glad: (^_^)" else: print "ledsen: (T_T)" def banna(self): """Ger husdjuret bannor. glad minskas.""" print "\n - Fy på dig", self.namn, "!" self.glad -= 3 def mata(self, mat): """Ger husdjuret mat. hunger minskas.""" print for i in range(mat): print "GLUFS", self.hunger -= mat def leka(self): """Leker med husdjuret. glad och hunger ökar""" self.glad += 1 print "\n~~~~~~~~~~~ WHEEEEEEE! ~~~~~~~~~~~" self.hunger += 3 def avsked(self): """Skriver ut avskedet.""" print print "Hejdå,", self.namn, "kommer att sakna dig!" |
def main(): djurnamn = raw_input("Vad vill du döpa ditt husdjur till? ") djur = Husdjur(djurnamn) djur.visaStatus() svar = raw_input(" Vill du \n banna \n mata \n leka med \n ditt husdjur? " ) while svar: if svar[0]=="m": bullar = input("Hur många bullar? ") djur.mata(bullar) elif svar[0]=="b": djur.banna() elif svar[0]=="l": djur.leka() else: print "Hursa? " djur.visaStatus() svar = raw_input(" Vill du \n banna \n mata \n leka med \n ditt husdjur? " ) djur.avsked() |
if svar[0]=="m":
innebär att vi bara tittar på första
tecknet i strängen svar. Det spelar alltså ingen roll om den som
kör programmet skriver m, mata, mums eller matematik - allt som
börjar på "m" kommer att tolkas som "mata".
I nästa exempel skapar vi flera husdjursobjekt som läggs i en lista.
Vi börjar med att titta på huvudprogrammet:
def main(): n = input("Hur många husdjur vill du ha? ") buren = Bur(n) buren.visa() svar = raw_input(" Vill du att dina husdjur ska \n bannas \n få mat \n leka \n mingla? " ) while svar: if svar[0]=="f": bullar = input("Hur många bullar var? ") buren.mata(bullar) elif svar[0]=="b": buren.banna() elif svar[0]=="l": buren.leka() elif svar[0]=="m": buren.mingel() else: print "Hursa? " buren.visa() svar = raw_input(" Vill du att dina husdjur ska \n bannas \n få mat \n leka \n mingla? " ) buren.avsked() |
class Bur(object): # Flera virtuella husdjur i en bur def __init__(self, n): """Skapar en lista med n stycken Husdjur""" self.lista = [] for i in range(n): self.lista.append(Husdjur()) def banna(self): """Skäller på alla djur""" for djur in self.lista: djur.banna() def mata(self, bullar): """Ger varje djur bullar""" for djur in self.lista: djur.mata(bullar) def leka(self): """Leker med varje djur""" for djur in self.lista: djur.leka() def mingel(self): """Låter husdjuren träffas och ev föröka sig""" print "Nu är det mingel i Buren!" n = len(self.lista) for i in range(n): djur1 = self.lista[i] for j in range(i+1,n): djur2 = self.lista[j] if djur1 != djur2 and djur1.kontakt(djur2): self.lista.append(Husdjur(djur1.namn(),djur2.namn())) def visa(self): """Visar alla husdjur i Buren""" n = len(self.lista) print "\n*** Det finns", n, "husdjur i Buren: ***" for djur in self.lista: print djur print "******************************************\n" def avsked(self): for djur in self.lista: djur.avsked() |
self.lista
I metoderna banna, leka, mata, visa och avsked går vi igenom
alla Husdjur i listan och bannar, leker, osv med vart och ett av dom.
Metoden mingel är speciell eftersom två Husdjursobjekt får interagera!
I nästlade for-slingor (den ena inuti den andra) ser vi till att
varje husdjur får chans att träffa varje annat husdjur (som speed-dating).
Anropet djur1.kontakt(djur2)
returnerar True om djur1 får
kontakt med djur2, och då får dom en unge tillsammans, som läggs till listan.
Men hur kan en metod involvera två olika objekt? Och vad är self då?
def kontakt(self, kompis): """Testar om kontakt uppstår mellan detta husdjur och dess kompis""" if (self.kon == kompis.kon): if (self.__preferens == "samma") and (kompis.__preferens == "samma"): print "Puss!" return True elif (self.kon != kompis.kon): if (self.__preferens == "annat") and (kompis.__preferens == "annat"): print "Puss!" return True else: return False |
def __str__(self): """Returnerar en sträng som beskriver husdjuret""" beskrivning = self.namnet + " är " if self.glad > 5: beskrivning += "glad: (^_^)" else: beskrivning += "ledsen: (T_T)" if self.hunger > 3: beskrivning += " och hungrig!" else: beskrivning += " och mätt." return beskrivning |
def __init__(self, namn1="", namn2=""): """Ger husdjurets attribut slumpade värden""" self.namnet = choice("BCFKR" )+choice("iouy")+\ choice("nst")*2+choice("aey") if namn1: self.namnet = namn1 + "-" + namn2 + "-" + self.namnet self.glad = randrange(10) self.hunger = randrange(3) self.kon = choice(("hona","hane")) self.__preferens = choice(("samma","annat")) |