p288 ! Methods are the same as functions but defined inside the class.
# Methods are functions defined inside a class

class Time: 
    def print(self):
        print('%.2d:%.2d:%.2d' % 
            (self.hour, self.minute, self.second)

start = Time()
start.hour = 9
start.minute = 45
start.second = 0

# Invoking a method is different from calling a function

Time.print(start) # 09:45:00


p291 In OOP, the objects are the active agents.
# In functional programming, the function is the active agent:
# Hey print_time! Here's an object to print
# In OOP, the objects are the active agents.
# Hey obj start! Please print yourself

class Time:
    def set(self, seconds):
        time = Time()
        minutes, time.seconds = divmod(seconds, 60)
        hour, time.minutes = divmod(minutes, 60)
        time.hour = hour
        return time

    def print(self):
        print('%.2d:%.2d:%.2d' % 
            (self.hour, self.minutes, self.seconds)

time = Time()
time.set(160).print() # 00:02:40

Special methods

p293 ! Method __init__ gets invoked when an object is instantiated.
# Method __init__ gets invoked when an object is instantiated
# Method __str__ returns a string representation of an object

class Time:
    def __init__(self, hour=0, min=0, sec=0):
        self.hour = hour
        self.min = min
        self.sec = sec

    def __str__(self):
        return '%.2d:%.2d:%.2d' % (self.hour, self.min, self.sec)

time = Time(9, 30)
print(time) # 09:30:00

Questions     github Class
Conditional Expression
        A B C D E F