So we’re back to the example I left in the last lesson:
# bank.py class Person(object): """This is the base class that represents a Person """ def __init__(self, first_name, last_name, age): self.first_name = first_name self.last_name = last_name self.age = age def get_full_name(self): return self.first_name +' '+ self.last_name class Employee(Person): """Since an employee is a Person, we indicate that we are a Person by declaring class Employee(Person): The item inside of () shows we inherit from Person """ def __init__(self, fname, lname, age, salary, manager): Person.__init__(self, first_name=fname, last_name=lname, age=age) self.salary = salary self.manager = manager def get_manager_salary(self): return self.manager.salary def is_owner(self): return True if self.manager is not None else False class Customer(Person): """A Customer is also a Person which means we also have a first and last name as well as an age """ def __init__(self, first_name, last_name, age, bank_account): Person.__init__(self, first_name, last_name, age=age) self.bank_account = bank_account def get_account_balance(self): return self.bank_account.balance def deposit(self, amount): # We return the new account balance return self.bank_account.increase_cash(amount) def spend(self, amount): return self.bank_account.decrease_cash(amount) class BankAccount(object): """A class that represents a bank account """ def __init__(self, balance, manager): self.balance = balance self.manager = manager def decrease_cash(self, spent_money): self.balance -= spent_money return self.balance def increase_cash(self, money): self.balance += money return self.balance if __name__ == '__main__': bank_manager = Employee('Scrooge', 'McMuffins', salary=1000000, age=99, manager=None) rich_bank_account = BankAccount(1000, bank_manager) rich_customer = Customer('Rich', 'Person', age=205, bank_account=rich_bank_account) print 'The bank manager for your bank is %s'%(bank_manager.get_full_name()) print 'Your account has $%d in it'%(rich_bank_account.balance) interest_payment = 2500 print '%s\'s account earns $%d of interest'%(rich_customer.get_full_name(), interest_payment) new_balance = rich_bank_account.increase_cash(interest_payment) print '%s\'s new balance is $%d'%(rich_customer.get_full_name(), new_balance) print '%s\'s age is %d years old'%(rich_customer.get_full_name(), rich_customer.age) print '%s spends a little money'%(rich_customer.get_full_name()) rich_customer.spend(100) print '%s now has $%d'%(rich_customer.get_full_name(), rich_customer.get_account_balance()) # He has the same mean bank manager as the rich person! poor_account = BankAccount(10, manager=bank_manager) poor_customer = Customer('Poor', 'Person', 105, poor_account) print '%s starts with $%d'%(poor_customer.get_full_name(), poor_account.balance) print '%s steals money from %s'%(bank_manager.get_full_name(), poor_customer.get_full_name()) poor_account.decrease_cash(5) print '%s now only has $%d'%(poor_customer.get_full_name(), poor_customer.get_account_balance())
Here I’m going to explain each part in detail, enough detail that you’ll hopefully be able to follow along and understand what classes are used for and how to use them.
Let’s first get some basic terminology out of the way. Class is simply the blueprint of an object, where a class is the code that describes how an object should behave, and an object is a single instance.
# person.py from bank import Person zach = Person('Zach', 'Hilbert', 109) slim = Person('Slim', 'Jim', 25) # zach is an instance of a Person print 'My name is ', zach.get_full_name() print 'But his name is', slim.get_full_name()
Here is an example using Person from bank.py. The first line of code: from bank import Person, simply says, from the bank module (ie. bank.py), import the Person class. Then we use Person to create zach. zach is an instance of Person. slim is also an instance of Person. Each instance of person has the ability to utilize the methods of Person (functions of class).
class Person(object): """This is the base class that represents a Person """ def __init__(self, first_name, last_name, age): self.first_name = first_name self.last_name = last_name self.age = age def get_full_name(self): return self.first_name +' '+ self.last_name
In the Person class, we have 2 methods, __init__ and get_full_name. get_full_name provides us a simple way to concatenate a person’s first and last names without having to write this every time we want their name. The __init__ method is called a constructor, because it is what is called when you construct an instance of the class Person.
When we call zach = Person(‘Zach’, ‘Hilbert’, 109), Person() is instantiating the Person class and assigning the object to zach, which is an instance of Person. When you call Person(‘Zach’, ‘Hilbert’, 109), __init__ gets called with ‘Zach’ as first_name, ‘Hilbert’ as last_name, and 109 as age. For each method in a class, self is also passed in as a reference to the current object, so anytime you call self.<method/property>, it calls the data from that instance. You can see this with zach and slim. In zach, self.first_name contains ‘Zach’, but slim contains ‘Slim’ for self.first_name.
The constructor of a class allows us to set necessary properties up front that may be use later. All other methods can be created for use as necessary. Employee and Customer inherit from Person, because they are people too, but both Employee and Customer have different properties and implementations. Employee has a salary and a manager, who happens to be another employee, and Customer has a bank account which is a class itself.
These classes allow us to represent real-world objects that we might need to manipulate and represent in an application. You can create as many people, employees, customers, and bank accounts as you want/need (as long as you have enough memory).
Often times you will have a database that saves information for each of these, and when you have customer ‘zach’ log into your application, your code gets zach’s information and bank account information and instantiates their respective classes to work with the zach object. You might have lots of these objects and they can interact with each other as you need.
The exact implementation isn’t important here. What is important is to understand that classes and objects help developers create applications that mimic real-world scenarios, and this is how many applications are built and used.
Beneath all of the classes you can see the use of each class and how each instance contains is own, separate data, as well as how these classes might be used to create a basic program.
Now that we have some of this more foundational material out of the way, I’ll focus more time on showing more realistic examples and implementations.