python programming in context chapter 10. objectives to explore classes and objects further to...
TRANSCRIPT
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
Astronomy
• Design classes to represent planets, sun, moons, etc.
• Use these classes to write programs that manipulate the solar system
Listing 10.1
class Planet: def __init__(self, iname, irad, im, idist): self.name = iname self.radius = irad self.mass = im self.distance = idist
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
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
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
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)
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
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()