Http://xkcd.com/. IS 313 Today Schedule Week 0: Classes Objects You're saying that Python's got...

Post on 30-Dec-2015

212 views 0 download

Tags:

Transcript of Http://xkcd.com/. IS 313 Today Schedule Week 0: Classes Objects You're saying that Python's got...

http://xkcd.com/

IS 313 Today

Schedule

Week 0:

Classes

ObjectsYou're saying that

Python's got class?

Dictionaries and Classes

Week 1:

Week 2:

Where we've been…

Where we're going…

Week 4:

Week 5:

Week 6:

Week 8:

Week 9:

Week 10:

Week 12:

Week 13:

Week 14:

Projects

Functions and Data

Loops and

language

42

key value

a Dictionary object…

'a'

Watch out!

http://www.youtube.com/watch?v=nBeUGqeYsQg

Python ~ an object-oriented programming language

ClassesMethods

input

output

42

key value

a Dictionary object…

'a'"Oh yeah!"

a String object…

Objects

TypesFunctions

Data reigns

Now it's data that's

royalty!

Almost all data in Java are OBJECTS

The CLASS of an object is its type.

METHODS are f'ns ~ "part of the

data"!

Some languages are ALL OBJECTS!

Lists vs. DictionariesIf I had a dictionary, I

guess I could look up what it was!

Lists are not perfect…

You can't choose what to name data.

You have to start at 0.

Some operations can be slow for big lists …

L[0], L[1], …

LL[0] L[1]

reference

5 42

if 'tiger' in L:

L[1985] = 'ox'

L[1986] = 'tiger'

More on dictionaries

Dictionaries have lots of built-in methods, or functions:

>>> d = {1990: 'horse', 1991: ram'}

>>> d.keys()

[ 1990, 1991 ]

>>> d.has_key( 1991 )

True

>>> d.has_key( 1969 )

False

>>> d.pop( 1988 )

'dragon'

They don't seem moronic to me!

pop deletes a key and returns its value

has_key checks if a key is present

keys returns a list of all keys

There's madness in this method!Methods

Functions

d.has_key( 1991 )

are functions that are called by the data itself!

has_key( 1991, d )

all data must be passed in as function inputs…

are called on their own…Warning: this

has_key function is for example

purposes only. It does not exist!

Classes and Objects

Design-it-yourself data.

Software Engineering

creating and composing functions

Building atop the work of others…

Insight into details, e.g., data storage and retrieval.

loops and data handling

Invention, not reinvention.creating new

data structures

Classes & Objects

An object-oriented programming language allows you to build your own customized types of variables.

(1) A class is a type of variable.

(2) An object is one such variable.

Classes & Objects

An object-oriented programming language allows you to build your own customized types of variables.

(1) A class is a type of variable.

(2) An object is one such variable.

There will typically be MANY objects of a single class.

Using objects and classes:

>>> d = dict()

>>> d['answer'] = 42

>>> dir(d)

all of the data members and methods of the dictionary class (and thus the object d !)

>>> d.keys()

[ 'answer' ]

>>> d.values()

[ 42 ]

A particularly appropriate reference …

two methods (functions) within all objects of class dictionary

an example of the dictionary constructor

s = str()dir!

The CONSTRUCTOR …

class dict: """ a dictionary class """

def __init__( self ): """ the CONSTRUCTOR """ # sets all of the data needed # there's no data here!

Code

Commentsdefines a new datatype called

dict

the constructor is named __init__ but is used via the

class name

It sets all the DATA MEMBERS

of a new object

the object is called self

The REPR …

class dict: """ a dictionary class """

def __repr__( self ): """ a grim method """ s = '{' for key in self.keys(): s += str(key) + ':' s += str( self[key] ) + ', ' s += '}' return s

Code

Commentsthis method is named __repr__ and it

provides a string that will be used when printing

the object being printed

is called self

the string to print gets returned

This code seems selfish to me...

Do-it-yourself data structures!

class: your own TYPE of data

object: a variable of your own class type

data members: data an object contains

methods: functions an object contains

benefits: encapsulation & abstraction

Object-oriented programming

Blueprint for an object

variables of that type

An object is alive, responsible, and intelligent.

- C++ FAQs

Examples…

Do reference libraries have

library references?

Python's class libraries… Graphics libraries

http://docs.python.org/lib/

>>> f = urllib.urlopen( 'http://www.cs.hmc.edu/~dodds/IS313/HW/index.html' )>>> text = f.read()>>> intro = text[:50]

Objects

An object is a data structure (like a list), except

(1) Its data elements have names chosen by the programmer.

(2) Data elements are chosen & organized by the programmer

(3) An object can have behaviors built-in by the programmer.

usually called "methods" instead of functions

User-defined structures that become part of the language (at least locally…)

But Why ?

• Flexibility

• Reusability

• Abstraction

ordinary data structures

create-your-own

write once, take anywhere

worry once, use anywhere

Date This is a class. It is a user-defined datatype that you'll build in the HW this week!

Are you asking what Date-a a Date

needs?

We want (or need) to represent lots of calendar days

The Problem

The Design What data should be set in the constructor?

What functionality will we need to support?

d.dow()usually some, but not all,

is known beforehand

Using Dates

this is an object of type Date

>>> d = Date(1,1,2012)

>>> d

1/1/2012

this is a CONSTRUCTOR …

What does it do?

the representation of a particular object of type Date

>>> d.isLeapYear()True

>>> d2 = Date(11,1,2010)

>>> d2

11/1/2010

>>> d2.isLeapYear()

False

the isLeapYear method returns True or False. How does it know what year to check?

How does it know to return False, instead of True in this case ??

Another object of type Date - again, via the constructor.

class Date:

def __init__( self, m, d, y ): """ the Date constructor """ self.month = m self.day = d self.year = y

def __repr__( self ): """ used for printing Dates """ s = "%02d/%02d/%04d" % (self.month, self.day, self.year) return s

def isLeapYear( self ):

The Date class

Why is everyone so far

away?!

>>> d = Date(1,1,2012)

>>> d

1/1/2012

self

These methods need access to the

object that calls them

>>> d.isLeapYear()True

>>> d2 = Date(12,31,2011)

>>> d2

12/31/2011

>>> d2.isLeapYear()

False

is the specific OBJECT THAT CALLED THE METHOD !

These methods need access to the

object that calls them

Why not use d?

Which leap is correct?

def isLeapYear( self ):

""" left-side leap """

if self.yr%400 == 0:

return True

elif self.yr%100 == 0:

return False

elif self.yr%4 == 0:

return True

else:

return False

def isLeapYear( self ):

""" right-side leap """

if self.yr%4 == 0:

return True

elif self.yr%100 == 0:

return False

elif self.yr%400 == 0:

return True

else:

return False

a Leap of faith….

class Date: def __init__( self, mo, dy, yr ): (constructor) def __repr__(self): (for printing)

def isLeapYear( self ): """ here it is """ if self.yr%400 == 0: return True if self.yr%100 == 0: return False if self.yr%4 == 0: return True return False

How about a 4000-year rule?

Date objects are mutable

>>> d = Date(1,1,2012)

>>> d

01/01/2012

always created with the CONSTRUCTOR …

>>> d.yesterday()

>>> d

12/31/2011

>>> d.tomorrow()

>>> d

01/01/2012

the yesterday method returns nothing at all. Is it doing anything?

Some methods return a value; others (like this one) change the object that call it!

d has changed!

watch out for changes!

Date ids

>>> d = Date(11,1,2010)

>>> d

11/1/2010

>>> d2 = Date(11,2,2010)

>>> d2

11/2/2010

What date is on your id?

What id is on your Date?

>>> d == d2

>>> d2.yesterday()

>>> d == d2

Will these be true or false?

>>> d.equals( d2 )

Double Date

>>> d2 = d

>>> d

11/1/2010

>>> d.yesterday()

>>> d2

>>> d2 == d

>>> d2.equals(d)

Excuse me -- ids please!

What happens

here?

Using copy

>>> d2 = d.copy()

>>> d

10/31/2010

>>> d2

10/31/2010

>>> d.yesterday()

>>> d2

>>> d2 == d

But where does copy come from?

What happens

here?

class Date: def __init__( self, mo, dy, yr ): def __repr__(self): def isLeapYear(self):

def copy(self): """ returns a DIFFERENT object w/same date! """

def equals(self, d2): """ returns True if they represent the same date; False otherwise """

Where are these TWO inputs

coming from?

class Date:

def isBefore(self, d2): """ True if self is before d2 """

if self.yr < d2.yr: return True

if self.mo < d2.mo: return True

if self.dy < d2.dy: return True

return False

What's wrong?

Why is this method WRONG for the dates

1/1/2011 11/2/2010

class Date:

def tomorrow(self): """ moves the date that calls it ahead 1 day """ DIM = [0,31,28,31,30,31,30,31,31,30,31,30,31]

Add these methods to Date

no computer required…

Prof. Art Benjamin

HW today / tomorrow

copy(self)

equals(self, d2)

yesterday(self)

tomorrow(self)

addNDays(self, N)

subNDays(self, N)

isBefore(self, d2)

isAfter(self, d2)

diff(self, d2)

dow(self)

and use your Date class to analyze our calendar a bit…

hw6p

r1.p

yhw

6pr2

.py

Unusual calendar years…

Unusual calendar years…

This is why Russia's October Revolution of 1917, in fact, happened

in November!

At least they kept Valentine's Day...

Upcoming calendar...Seems appropriate!

November 8

November 15

November 22

November 29

December 6

December 13

Classes and objects, part 2

Final project introductions

User interfaces + personal software engineering

No class (conference)

Project Presentations: progress so far

No class; projects are due this week.

What's next?

Python has no Connect-four datatype…

| | | | | | | || | | | | | | || | | | | | | || | | |X| | | || |X| |X|O| | ||X|O|O|O|X| |O|--------------- 0 1 2 3 4 5 6

Can I see a demo?

… but we can correct that!Aargh!

Lab time...

homework questions?other questions?

Try it…class Date:

def isBefore(self, d2): """ True if self is before d2 """

if self.yr < d2.yr: return True if self.mo < d2.mo: return True if self.dy < d2.dy: return True return False

def tomorrow(self): """ moves the date that calls it ahead 1 day """ DIM = [0,31,28,31,30,31,30,31,31,30,31,30,31]

Why is this method WRONG for the dates

DIM might be helpful…

This tomorrow method should not return anything. It just CHANGES the date

object that calls it.

1/1/2011 11/2/2010

how might you fix this problem?

Designing classes

1) What data? (Data Members)

2) What are objects' crucial capabilities? (Methods)

Not limited to 7x6!

Connect Four: the object b

Boardb

intwidthstr str str

str str str

str str str

datalist str

str

str

data

intheight

What is the name of the method that will construct this data?

Connect Four: constructor

class Board: """ a datatype representing a C4 board with an arbitrary number of rows and cols """ def __init__( self, width, height ): """ the constructor for objects of type Board """ self.width = width self.height = height self.data = [] # this will be the board for row in range( 6 ): boardRow = [] for col in range( 7 ): boardRow += [' '] # add a space to this row self.data += [boardRow]

Bad magic?

Connect Four: the object b

Boardb

intwidthstr str str

str str str

str str str

datalist str

str

str

intheight

| | | | | | | || | | | | | | || | | | | | | || | | |X| | | || |X| |X|O| | ||X|O|O|O|X| |O|--------------- 0 1 2 3 4 5 6

What is the name of the method that will print this data?

def __repr__(self): """ this method returns a string representation for an object of type Board """ s = '' for row in range( 6 ): s += '|' for col in range( 7 ): s += self.data[row][col] + '|' s += '\n'

return s

Connect Four: __repr__

To remove?

To add?

which row is row 0, row 1, and so on?

Examplesdef addMove(self, col, ox):

row = self.height-1 while True: if self.data[row][col] == ' ': self.data[row][col] = ox

row -= 1

def allowsMove(self, col):

Step through this addMove method.

How does it work?

What's wrong?

a C4 board

col #'X' or 'O'

allowsMove should return True if col is a valid move;

False otherwise.

C4 Board class: methods

__init__( self, width, height )

allowsMove( self, col )

__repr__( self )

addMove( self, col, ox )

isFull( self )

winsFor( self, ox )

the “constructor”

checks if allowed

places a checker

outputs a string

checks if any space is left

checks if a player has won

hostGame( self )play!

delMove( self, col )removes a checker

Which is trickiest… ?

Checking wins… ?

Thoughts?

X O

b

corner cases?

Lab … and hw questions

Thinking about final projects…

There are several well-made, concise tutorials…

want to brush up on anything?

Two good references for looking up syntax…

for checking out just one thing!

wikipedia, for sure http://www.cis.upenn.edu/~matuszek/General/JavaSyntax/

Aha! But what is this I see?

Constructors are giving me a HEAP of trouble!

"thinking like a computer"or, at least, like Java.

data

constructor(s)

http://xkcd.com/

IS 313 Today

Schedule

Week 0:

Classes

ObjectsYou're saying that

Python's got class?

Dictionaries and Classes

Week 1:

Week 2:

Where we've been…

Where we're going…

Week 4:

Week 5:

Week 6:

Week 8:

Week 9:

Week 10:

Week 12:

Week 13:

Week 14:

Projects

Functions and Data

Loops and

language

42

key value

a Dictionary object…

'a'

Python ~ an object-oriented programming language

ClassesMethods

input

output

42

key value

a Dictionary object…

'a'"Oh yeah!"

a String object…

Objects

TypesFunctions

Data reigns

Now it's data that's

royalty!

Almost all data in Java are OBJECTS

The CLASS of an object is its type.

METHODS are f'ns ~ "part of the

data"!

Some languages are ALL OBJECTS!

There's madness in this method!Methods

Functions

d.has_key( 1991 )

are functions that are called by the data itself!

has_key( 1991, d )

all data must be passed in as function inputs…

are called on their own…Warning: this

has_key function is for example

purposes only. It does not exist!

Software Engineering

creating and composing functions

Building atop the work of others…

Insight into details, e.g., data storage and retrieval.

loops and data handling

Invention, not reinvention.creating new

data structures

Classes & Objects

An object-oriented programming language allows you to build your own customized types of variables.

(1) A class is a type of variable.

(2) An object is one such variable.

There will typically be MANY objects of a single class.

Using objects and classes:

>>> d = dict()

>>> d['answer'] = 42

>>> dir(d)

all of the data members and methods of the dictionary class (and thus the object d !)

>>> d.keys()

[ 'answer' ]

>>> d.values()

[ 42 ]

A particularly appropriate reference …

two methods (functions) within all objects of class dictionary

an example of the dictionary constructor

s = str()dir!

The CONSTRUCTOR …

class dict: """ a dictionary class """

def __init__( self ): """ the CONSTRUCTOR """ # sets all of the data needed # there's no data here!

Code

Commentsdefines a new datatype called

dict

the constructor is named __init__ but is used via the

class name

It sets all the DATA MEMBERS

of a new object

the object is called self

The REPR …

class dict: """ a dictionary class """

def __repr__( self ): """ a grim method """ s = '{' for key in self.keys(): s += str(key) + ':' s += str( self[key] ) + ', ' s += '}' return s

Code

Commentsthis method is named __repr__ and it

provides a string that will be used when printing

the object being printed

is called self

the string to print gets returned

This code seems selfish to me...

Objects

An object is a data structure (like a list), except

(1) Its data elements have names chosen by the programmer.

(2) Data elements are chosen & organized by the programmer

(3) An object can have behaviors built-in by the programmer.

usually called "methods" instead of functions

User-defined structures that become part of the language (at least locally…)

But Why ?

• Flexibility

• Reusability

• Abstraction

ordinary data structures

create-your-own

write once, take anywhere

worry once, use anywhere

Date This is a class. It is a user-defined datatype that you'll build in the HW this week!

Are you asking what Date-a a Date

needs?

We want (or need) to represent lots of calendar days

The Problem

The Design What data should be set in the constructor?

What functionality will we need to support?

d.dow()usually some, but not all,

is known beforehand

Using Dates

this is an object of type Date

>>> d = Date(1,1,2012)

>>> d

1/1/2012

this is a CONSTRUCTOR …

What does it do?

the representation of a particular object of type Date

>>> d.isLeapYear()True

>>> d2 = Date(11,1,2010)

>>> d2

11/1/2010

>>> d2.isLeapYear()

False

the isLeapYear method returns True or False. How does it know what year to check?

How does it know to return False, instead of True in this case ??

Another object of type Date - again, via the constructor.

class Date:

def __init__( self, m, d, y ): """ the Date constructor """ self.month = m self.day = d self.year = y

def __repr__( self ): """ used for printing Dates """ s = "%02d/%02d/%04d" % (self.month, self.day, self.year) return s

def isLeapYear( self ):

The Date class

Why is everyone so far

away?!

>>> d = Date(1,1,2012)

>>> d

1/1/2012

self

These methods need access to the

object that calls them

>>> d.isLeapYear()True

>>> d2 = Date(12,31,2011)

>>> d2

12/31/2011

>>> d2.isLeapYear()

False

is the specific OBJECT THAT CALLED THE METHOD !

These methods need access to the

object that calls them

Why not use d?

a Leap of faith….

class Date: def __init__( self, mo, dy, yr ): (constructor) def __repr__(self): (for printing)

def isLeapYear( self ): """ here it is """ if self.yr%400 == 0: return True if self.yr%100 == 0: return False if self.yr%4 == 0: return True return False

How about a 4000-year rule?

Date objects are mutable

>>> d = Date(1,1,2012)

>>> d

01/01/2012

always created with the CONSTRUCTOR …

>>> d.yesterday()

>>> d

12/31/2011

>>> d.tomorrow()

>>> d

01/01/2012

the yesterday method returns nothing at all. Is it doing anything?

Some methods return a value; others (like this one) change the object that call it!

d has changed!

watch out for changes!

Date ids

>>> d = Date(11,1,2010)

>>> d

11/1/2010

>>> d2 = Date(11,2,2010)

>>> d2

11/2/2010

What date is on your id?

What id is on your Date?

>>> d == d2

>>> d2.yesterday()

>>> d == d2

Will these be true or false?

>>> d.equals( d2 )

Double Date

>>> d2 = d

>>> d

11/1/2010

>>> d.yesterday()

>>> d2

>>> d2 == d

>>> d2.equals(d)

Excuse me -- ids please!

What happens

here?

Using copy

>>> d2 = d.copy()

>>> d

10/31/2010

>>> d2

10/31/2010

>>> d.yesterday()

>>> d2

>>> d2 == d

But where does copy come from?

What happens

here?

class Date: def __init__( self, mo, dy, yr ): def __repr__(self): def isLeapYear(self):

def copy(self): """ returns a DIFFERENT object w/same date! """

def equals(self, d2): """ returns True if they represent the same date; False otherwise """

Where are these TWO inputs

coming from?

class Date:

def isBefore(self, d2): """ True if self is before d2 """

if self.yr < d2.yr: return True

if self.mo < d2.mo: return True

if self.dy < d2.dy: return True

return False

What's wrong?

Why is this method WRONG for the dates

1/1/2011 11/2/2010

class Date:

def tomorrow(self): """ moves the date that calls it ahead 1 day """ DIM = [0,31,28,31,30,31,30,31,31,30,31,30,31]

Add these methods to Date

no computer required…

Prof. Art Benjamin

HW today / tomorrow

copy(self)

equals(self, d2)

yesterday(self)

tomorrow(self)

addNDays(self, N)

subNDays(self, N)

isBefore(self, d2)

isAfter(self, d2)

diff(self, d2)

dow(self)

and use your Date class to analyze our calendar a bit…

hw6p

r1.p

yhw

6pr2

.py

Unusual calendar years…

Unusual calendar years…

This is why Russia's October Revolution of 1917, in fact, happened

in November!

At least they kept Valentine's Day...

Upcoming calendar...Seems appropriate!

November 8

November 15

November 22

November 29

December 6

December 13

Classes and objects, part 2

Final project introductions

User interfaces + personal software engineering

No class (conference)

Project Presentations: progress so far

No class; projects are due this week.

What's next?

Python has no Connect-four datatype…

| | | | | | | || | | | | | | || | | | | | | || | | |X| | | || |X| |X|O| | ||X|O|O|O|X| |O|--------------- 0 1 2 3 4 5 6

Can I see a demo?

… but we can correct that!Aargh!