[Tutor] Is this correct?
Alan Gauld
alan.gauld at freenet.co.uk
Sun Apr 16 09:39:50 CEST 2006
>> Personally I prefer to put the initialisation
>> into an __init__() method,
> Thanks for your comments. Please, see below a new
> version of that exercise. What do you think?
> hour = int( raw_input('Enter the hour: ') )
> min = int( raw_input('Enter the minute: ') )
> sec = int( raw_input('Enter the sec: ') )
>
>
> class Time:
> def __init__(self, hours = 0, minutes = 0, seconds =
> 0):
> self.hours = hours
> self.minutes = minutes
> self.seconds = seconds
>
> def printTime(self): # By convention, the first
> parameter of a method is called self.
> '''printTime:
>
> Prints the time.'''
> print str(self.hours) + ":" + str(self.minutes) +
> ":" + str(self.seconds)
>
>
> def convertToSeconds(t):
> ''' convertToSeconds:
>
> Converts a Time object into an integer.'''
> minutes = t.hours * 60 + t.minutes
> seconds = t.minutes * 60 + t.seconds
> return seconds
So far so good.
> def makeTime(seconds):
> ''' makeTime:
> Converts from an integer to a Time object.'''
> time = Time()
> time.hours = seconds/3600
> seconds = seconds - time.hours * 3600
> time.minutes = seconds/60
> seconds = seconds - time.minutes * 60
> time.seconds = seconds
> return time
I'd rework this bit to:
hours = seconds/3600
seconds = seconds % 3600 # use % to get remainder
minutes = seconds/60
seconds = seconds % 60 #and again
time = Time(hours,minutes,seconds)
return time
And by using divmod() you can combine two lines into one:
hours,seconds = divmod(seconds,3600)
minutes,seconds = divmod(seconds,60)
time = Time(hours,minutes,seconds)
return time
> def addTime(t1, t2):
> ''' addTime function:
>
> Calculates the sum of two times.'''
> seconds = convertToSeconds(t1) + convertToSeconds(t2)
> return makeTime(seconds)
> currentTime = Time()
> currentTime.hours = hour
> currentTime.minutes = min
> currentTime.seconds = sec
> currentTime.printTime()
I'd move the raw_input lines from the top to here so
that the logical connection between them and this is clearer.
And you don't use your init method here. Do this instead:
currentTime = Time(hour,min,sec)
currentTime.printTime()
One of the principles of OOP is that you should try not to access
the data members of the class directly, use methods to do all the work.
[The reason for this is that we can overrride the methods in
subclasses but we can't override the data so using data directly
limits the effectiveness of subclassing as a mechanism, for changing
the behaviour of your code without modifying it. (In Computer Science
speak this is known as the Open/Closed principle - open for extension,
closed for modification) ]
HTH,
Alan G
Author of the learn to program web tutor
http://www.freenetpages.co.uk/hp/alan.gauld
More information about the Tutor
mailing list