classes and objects - software carpentry: · 2016. 11. 17. · classes and objects inheritance...

51
Inheritance Copyright © Software Carpentry 2010 This work is licensed under the Creative Commons Attribution License See http://software-carpentry.org/license.html for more information. Classes and Objects

Upload: others

Post on 04-Mar-2021

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Inheritance

Copyright © Software Carpentry 2010This work is licensed under the Creative Commons Attribution License

See http://software-carpentry.org/license.html for more information.

Classes and Objects

Page 2: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Interpolating time series signals

time

stre

ngth

Page 3: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Interpolating time series signals

time

stre

ngth

step function

linear interpolation

Page 4: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Interpolating time series signals

time

stre

ngth

step function

linear interpolation

A lot of the implementation

is the same

Page 5: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Interpolating time series signals

time

stre

ngth

step function

linear interpolation

A lot of the implementation

is the same

How can we eliminate

the reduncancy?

Page 6: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

First implementationclass StepSignal(object):...def get(self, where):

if where < self.values[0][0]:raise IndexError, '%f too low' % where

for i in range(len(self.values)-1):x0, y0 = self.values[i]x1, y1 = self.values[i+1]if x0 <= where <= x1:

return y0raise IndexError, '%f too high' % where

Page 7: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Second implementationclass LinearSignal(object):...def get(self, where):

if where < self.values[0][0]:raise IndexError, '%f too low' % where

for i in range(len(self.values)-1):x0, y0 = self.values[i]x1, y1 = self.values[i+1]if x0 <= where <= x1:

return y0 + (y1-y0) * (where-x0) / (x1-x0)raise IndexError, '%f too high' % where

Page 8: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Second implementationclass LinearSignal(object):...def get(self, where):

if where < self.values[0][0]:raise IndexError, '%f too low' % where

for i in range(len(self.values)-1):x0, y0 = self.values[i]x1, y1 = self.values[i+1]if x0 <= where <= x1:

return y0 + (y1-y0) * (where-x0) / (x1-x0)raise IndexError, '%f too high' % where

Page 9: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Refactorclass StepSignal(object):def get(self, where):

i = self.find(self, where)return self.values[i][1]

class LinearSignal(object):def get(self, where):

i = self.find(self, where)x0, y0 = self.values[i]x1, y1 = self.values[i+1]return y0 + (y1-y0) * (where-x0)/(x1-x0)

Page 10: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Refactorclass StepSignal(object):def get(self, where):

i = self.find(self, where)return self.values[i][1]

class LinearSignal(object):def get(self, where):

i = self.find(self, where)x0, y0 = self.values[i]x1, y1 = self.values[i+1]return y0 + (y1-y0) * (where-x0)/(x1-x0)

Where to put find?

Page 11: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Refactorclass StepSignal(object):def get(self, where):

i = self.find(self, where)return self.values[i][1]

class LinearSignal(object):def get(self, where):

i = self.find(self, where)x0, y0 = self.values[i]x1, y1 = self.values[i+1]return y0 + (y1-y0) * (where-x0)/(x1-x0)

Where to put find?

Don't want to duplicate

Page 12: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Use inheritance

Page 13: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Use inheritanceclass Parent(object):def hello(self):

print 'hello'

Page 14: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Use inheritanceclass Parent(object):def hello(self):

print 'hello'

class Child(Parent):def goodbye(self):

print 'goodbye'

Page 15: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Use inheritanceclass Parent(object):def hello(self):

print 'hello'

class Child(Parent):def goodbye(self):

print 'goodbye'

Child inherits

from Parent

Page 16: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Use inheritanceclass Parent(object):def hello(self):

print 'hello'

class Child(Parent):def goodbye(self):

print 'goodbye'

c = Child()c.goodbye()goodbye

Child inherits

from Parent

Page 17: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Use inheritanceclass Parent(object):def hello(self):

print 'hello'

class Child(Parent):def goodbye(self):

print 'goodbye'

c = Child()c.goodbye()goodbyec.hello()hello

Child inherits

from Parent

Page 18: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Use inheritanceclass Parent(object):def hello(self):

print 'hello'

class Child(Parent):def goodbye(self):

print 'goodbye'

c = Child()c.goodbye()goodbyec.hello()hellop = Parent()p.hello()hello

Child inherits

from Parent

Page 19: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Use inheritanceclass Parent(object):def hello(self):

print 'hello'

class Child(Parent):def goodbye(self):

print 'goodbye'

c = Child()c.goodbye()goodbyec.hello()hellop = Parent()p.hello()hellop.goodbye()AttributeError: 'Parent'

objecthas no attribute 'goodbye'

Child inherits

from Parent

Page 20: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Contents of memory

p

c

Parent

object

Child

hello

goodbye

Page 21: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Contents of memory

p

c

Parent

object

Child

hello

goodbye

Page 22: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Contents of memory

p

c

Parent

object

Child

hello

goodbye

Page 23: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Contents of memory

p

c

Parent

object

Child

hello

goodbye

Page 24: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Contents of memory

p

c

Parent

object

Child

hello

goodbye

Page 25: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Contents of memory

p

c

Parent

object

Child

hello

goodbye

Page 26: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

class InterpolatedSignal(object):

def find(self, where):if where < self.values[0][0]:

raise IndexError, '%f too low' % wherefor i in range(len(self.values)-1):

x0, y0 = self.values[i]x1, y1 = self.values[i+1]if x0 <= where <= x1:

return iraise IndexError, '%f too high' % where

Page 27: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

class InterpolatedSignal(object):

def find(self, where):if where < self.values[0][0]:

raise IndexError, '%f too low' % wherefor i in range(len(self.values)-1):

x0, y0 = self.values[i]x1, y1 = self.values[i+1]if x0 <= where <= x1:

return iraise IndexError, '%f too high' % where

Not much use on its own

Page 28: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

class InterpolatedSignal(object):

def find(self, where):if where < self.values[0][0]:

raise IndexError, '%f too low' % wherefor i in range(len(self.values)-1):

x0, y0 = self.values[i]x1, y1 = self.values[i+1]if x0 <= where <= x1:

return iraise IndexError, '%f too high' % where

Not much use on its own

Where does this

come from?

Page 29: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Derive specific interpolators

Page 30: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Derive specific interpolatorsclass StepSignal(InterpolatedSignal):

def __init__(self, values):self.values = values[:]

def get(self, where):i = self.find(where)return self.values[i][1]

Page 31: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Derive specific interpolatorsclass StepSignal(InterpolatedSignal):

def __init__(self, values):self.values = values[:]

def get(self, where):i = self.find(where)return self.values[i][1]

Page 32: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Derive specific interpolatorsclass StepSignal(InterpolatedSignal):

def __init__(self, values):self.values = values[:]

def get(self, where):i = self.find(where)return self.values[i][1]

Page 33: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Derive specific interpolatorsclass StepSignal(InterpolatedSignal):

def __init__(self, values):self.values = values[:]

def get(self, where):i = self.find(where)return self.values[i][1]

Page 34: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Derive specific interpolatorsclass StepSignal(InterpolatedSignal):

def __init__(self, values):self.values = values[:]

def get(self, where):i = self.find(where)return self.values[i][1]

Fragile

Page 35: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Derive specific interpolatorsclass StepSignal(InterpolatedSignal):

def __init__(self, values):self.values = values[:]

def get(self, where):i = self.find(where)return self.values[i][1]

Dependencies between classes should be explicit

Page 36: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Have the parent class store the values

Page 37: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Have the parent class store the valuesclass InterpolatedSignal(object):

def __init__(self, values):self.values = values[:]

def get(self, where):raise NotImplementedError('Must provide

get!')

def find(self, where):...as before...

Page 38: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Have the parent class store the valuesclass InterpolatedSignal(object):

def __init__(self, values):self.values = values[:]

def get(self, where):raise NotImplementedError('Must provide

get!')

def find(self, where):...as before...

Page 39: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

The child's constructor relies on the parent'sclass StepSignal(InterpolatedSignal):

def __init__(self, values):InterpolatedSignal.__init__(self, values)

def get(self, where):i = self.find(where)return self.values[i][1]

Page 40: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

The child's constructor relies on the parent'sclass StepSignal(InterpolatedSignal):

def __init__(self, values):InterpolatedSignal.__init__(self, values)

def get(self, where):i = self.find(where)return self.values[i][1]

Page 41: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Other classes are just as easyClass LinearSignal(InterpolatedSignal):

def __init__(self, values):InterpolatedSignal.__init__(self, values)

def get(self, where):i = self.find(where)return y0 + (y1-y0) * (where-x0)/(x1-x0)

Page 42: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

class InterpolatedSignal(object):def __init__(self, values):

assert len(values) > 0, 'Must have some pairs'for i in range(len(values)):

assert len(values[i]) == 2, 'Entries must be pairs'for i in range(len(values)-1)):

x0 = values[i][0]x1 = values[i][1]assert x0 < x1, 'Samples must increase on

x'

>>> signal = StepSignal([ [1., 0.], [0., 2] ])AssertionError: Samples must increase on x

Page 43: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Child overrides parent method

signal

InterpolatedSignal

object

StepSignal

__init__

__init__

findget

get

Page 44: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Overriding in action

Page 45: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Overriding in actionclass Parent(object):def hello(self):

print 'hello'def goodbye(self):

print 'goodbye'

Page 46: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Overriding in actionclass Parent(object):def hello(self):

print 'hello'def goodbye(self):

print 'goodbye'

class Child(Parent):def goodbye(self):

print 'au revoir'

Page 47: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Overriding in actionclass Parent(object):def hello(self):

print 'hello'def goodbye(self):

print 'goodbye'

class Child(Parent):def goodbye(self):

print 'au revoir'

Child overrides

Parent

Page 48: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Overriding in actionclass Parent(object):def hello(self):

print 'hello'def goodbye(self):

print 'goodbye'

class Child(Parent):def goodbye(self):

print 'au revoir'

p = Parent()p.hello()hellop.goodbye()goodbye

Page 49: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Overriding in actionclass Parent(object):def hello(self):

print 'hello'def goodbye(self):

print 'goodbye'

class Child(Parent):def goodbye(self):

print 'au revoir'

p = Parent()p.hello()hellop.goodbye()goodbyeC = child()c.hello()hello

Page 50: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

Classes and Objects Inheritance

Overriding in actionclass Parent(object):def hello(self):

print 'hello'def goodbye(self):

print 'goodbye'

class Child(Parent):def goodbye(self):

print 'au revoir'

p = Parent()p.hello()hellop.goodbye()goodbyeC = child()c.hello()helloc.goodbye()au revoir

Page 51: Classes and Objects - Software Carpentry: · 2016. 11. 17. · Classes and Objects Inheritance Interpolating time series signals time strength step function linear interpolation A

January 2011

Copyright © Software Carpentry 2010This work is licensed under the Creative Commons Attribution License

See http://software-carpentry.org/license.html for more information.

created by

Greg Wilson