python programming in context chapter 10. objectives to explore classes and objects further to...

35
Python Programming in Context Chapter 10

Upload: thomas-sparks

Post on 02-Jan-2016

222 views

Category:

Documents


0 download

TRANSCRIPT

Python Programming in Context

Chapter 10

Objectives

• To explore classes and objects further• To understand how to construct a class• To write constructors, accessor methods, and

mutator methods• To understand the concept of self• To explore instance data• To implement a graphical simulation using

objects

Object Oriented Programming

• Objects are instances of Classes• Objects can perform methods• Instance Data– What an object knows about itself

• Methods– What an object can do

Turtle objects

• Instance Data– Color– Heading– Tail position

• Methods– Forward– Backward– Up

Astronomy

• Design classes to represent planets, sun, moons, etc.

• Use these classes to write programs that manipulate the solar system

Planet Class

• Instance Data– Name– Mass– Distance from sun– radius

Listing 10.1

class Planet: def __init__(self, iname, irad, im, idist): self.name = iname self.radius = irad self.mass = im self.distance = idist

Figure 10.1

Types of Methods

• Constructor– Used to make a new instance of the class

• Accessor– Used to get information from an object– Get instance data

• Mutator– Used to change something about an object– Change instance data

Listing 10.2

def getName(self): return self.name def getRadius(self): return self.radius def getMass(self): return self.mass

def getDistance(self): return self.distance

Listing 10.3

def getVolume(self): v = 4.0/3 * math.pi * self.radius**3 return v def getSurfaceArea(self): sa = 4.0 * math.pi * self.radius**2 return sa def getDensity(self): d = self.mass / self.getVolume() return d

Listing 10.4

def setName(self, newname): self.name = newname

Listing 10.5

def show(self): print(self.name)

Listing 10.6

def __str__(self): return self.name

Figure 10.2

Namespaces

• Namespaces and reference work as they did before

• self is the name of the implicit parameter that always refers to the object itself

• Never explicitly pass a value to the implicit parameter

Figure 10.3

Figure 10.4

The Sun Class

• Instance Data– Name– Mass– Radius– Temperature

Listing 10.7import mathclass Sun: def __init__(self, iname, irad, im, itemp): self.name = iname self.radius = irad self.mass = im self.temp = itemp def getMass(self): return self.mass

def __str__(self): return self.name

Solar System Class

• A sun• Many planets– Use a list to keep the collection of planets

Listing 10.8

class SolarSystem: def __init__(self, asun): self.thesun = asun self.planets = []

def addPlanet(self, aplanet): self.planets.append(aplanet) def showPlanets(self): for aplanet in self.planets: print(aplanet)

Figure 10.5

Visualize and Animate

• Use a turtle to draw the sun and the planets• Animate the solar system by moving the turtle• Need to develop a simple understanding of

planetary movement– Velocity– Acceleration– Mass

Listing 10.9class SolarSystem: def __init__(self, width, height): self.thesun = None self.planets = [] self.ssturtle = turtle.Turtle() self.ssturtle.hideturtle() self.ssscreen = turtle.Screen() self.ssscreen.setworldcoordinates(-width/2.0,-height/2.0,width/2.0,height/2.0)

def addPlanet(self, aplanet): self.planets.append(aplanet)

def addSun(self, asun): self.thesun = asun

def showPlanets(self): for aplanet in self.planets: print(aplanet)

def freeze(self): self.ssscreen.exitonclick()

Listing 10.10class Sun: def __init__(self, iname, irad, im, itemp): self.name = iname self.radius = irad self.mass = im self.temp = itemp self.x = 0 self.y = 0

self.sturtle = turtle.Turtle() self.sturtle.shape("circle") self.sturtle.color("yellow")

#other methods as before def getXPos(self): return self.x

def getYPos(self): return self.y

Listing 10.11class Planet: def __init__(self, iname, irad, im, idist, ic): self.name = iname self.radius = irad self.mass = im self.distance = idist self.x = idist self.y = 0 self.color = ic

self.pturtle = turtle.Turtle() self.pturtle.color(self.color) self.pturtle.shape("circle") self.pturtle.up() self.pturtle.goto(self.x,self.y) self.pturtle.down()

#other methods as before def getXPos(self): return self.x def getYPos(self): return self.y

Figure 10.6

Figure 10.7

Figure 10.8

Listing 10.12

class Planet: def __init__(self, iname, irad, im, idist, ivx, ivy, ic): #other instance variables as before self.velx = ivx self.vely = ivy

Listing 10.13 def moveTo(self, newx, newy): self.x = newx self.y = newy self.pturtle.goto(newx, newy) def getXVel(self): return self.velx def getYVel(self): return self.vely def setXVel(self, newvx): self.velx = newvx def setYVel(self, newvy): self.vely = newvy

Listing 10.14def movePlanets(self):

G = .1 dt = .001

for p in self.planets: p.moveTo(p.getXPos() + dt * p.getXVel(), p.getYPos() + dt * p.getYVel()) rx = self.thesun.getXPos() - p.getXPos() ry = self.thesun.getYPos() - p.getYPos() r = math.sqrt(rx**2 + ry**2) accx = G * self.thesun.getMass()*rx/r**3 accy = G * self.thesun.getMass()*ry/r**3

p.setXVel(p.getXVel() + dt * accx) p.setYVel(p.getYVel() + dt * accy)

Listing 10.15def createSSandAnimate(): ss = SolarSystem(2,2) sun = Sun("SUN", 5000, 10, 5800) ss.addSun(sun)

m = Planet("MERCURY", 19.5, 1000, .25, 0, 2, "blue") ss.addPlanet(m) m = Planet("EARTH", 47.5, 5000, 0.3, 0, 2.0, "green") ss.addPlanet(m) m = Planet("MARS", 50, 9000, 0.5, 0, 1.63, "red") ss.addPlanet(m) m = Planet("JUPITER", 100, 49000, 0.7, 0, 1, "black") ss.addPlanet(m)

numTimePeriods = 2000 for amove in range(numTimePeriods): ss.movePlanets() ss.freeze()

createSSandAnimate()

Figure 10.9