class - define a class
def - define a function or method
What is a class? A logical grouping of data and functions
What is logical grouping? Create a class where there is a logical connection between things rather than just throwing random thing together under a class.
Example: Customer, Product
class Customer(object):
def withdraw(self, amount):
Classes - blueprints for creating object
When we define a class using class keyword, we haven't actually created an object.
class Customer(object):
def __init__(self, name, balance=0.0):
self.name = name
self.balance = balance
def withdraw(self, amount):
if amount > self.balance:
raise RuntimeError('Amount greater than available balance.')
self.balance -= amount
return self.balance
def deposit(self, amount):
self.balance += amount
return self.balance
- We call the __init__ method with argument to create an object
-
- jeff object, known as an instance, is an object of Customer class
- before Customer() is called, no customer object existed.
- There is always 1 Customer class regardless of how many instances created
jeff = Customer('Jeff', 1000.0)
- Calling jeff.withdraw(100.0) puts those instructions to use on the jeff instance.
- when we define
- self is the instance of the Customer that withdraw is being called on.
def withdraw(self, amount):
Customer.withdraw(jeff, 100.0)
jeff.withdraw(100.0)
=
jeff = Customer('Jeff', 1000.0)
jeff.withdraw(100.0)
- When we call __init__, we are in the process of creating an object.
- When we initialize object like:
class Customer(object):
def __init__(self, name, balance=0.0):
self.name = name
self.balance = balance
jeff = Customer('Jeff', 1000.0)
jeff = Customer(jeff, 'Jeff', 1000.0)
=
jeff.name = name
jeff.balance = balance
self.name = name
self.balance = balance
=
- Be careful what you __init__, make sure the object is fully-initialized.
class Customer(object):
def __init__(self, name):
self.name = name
def set_balance(self, balance=0.0):
self.balance = balance
def withdraw(self, amount):
if amount > self.balance:
raise RuntimeError('Amount greater than available balance.')
self.balance -= amount
return self.balance
def deposit(self, amount):
self.balance += amount
return self.balance
** don't introduce a new attribute outside of __init__ method
- A methods have access to all the data contained on the instance of the object.
- They can access and modify anything previously set on self.
- Because they use self, they require an instance of the class in order to be used.
- Class attributes are attributes that are set at the class-level
- Normal attributes are introduced in __init__ method, but some attributes of a class hold for all instances in all cases.
class Car(object):
wheels = 4
def __init__(self, make, model):
self.make = make
self.model = model
mustang = Car('Ford', 'Mustang')
print mustang.wheels
# 4
print Car.wheels
# 4
- Inheritance is the process by which a "child" class derives the data and behavior of a "parent" class.
- Example:
We sell all types of vehicles, from motorcycles to trucks. The price of a vehicle is 5000 x number of wheels.
We buy trucks in 10000, cars in 8000 and motorcycles in 4000.
class Car(object):
def __init__(self, wheels, miles, make, model, year):
self.wheels = wheels
self.miles = miles
self.make = make
self.model = model
self.year = year
def sale_price(self):
return 5000.0 * self.wheels
def purchase_price(self):
return 8000 - (.10 * self.miles)
class Truck(object):
def __init__(self, wheels, miles, make, model, year):
self.wheels = wheels
self.miles = miles
self.make = make
self.model = model
self.year = year
def sale_price(self):
return 5000.0 * self.wheels
def purchase_price(self):
return 10000 - (.10 * self.miles)
Don't Repeat Yourself!
class Vehicle(object):
base_sale_price = 0
def __init__(self, wheels, miles, make, model, year):
self.wheels = wheels
self.miles = miles
self.make = make
self.model = model
self.year = year
def sale_price(self):
return 5000.0 * self.wheels
def purchase_price(self):
return self.base_sale_price - (.10 * self.miles)
class Car(Vehicle):
def __init__(self, wheels, miles, make, model, year):
self.wheels = wheels
self.miles = miles
self.make = make
self.model = model
self.year = year
self.base_sale_price = 8000
class Truck(Vehicle):
def __init__(self, wheels, miles, make, model, year):
self.wheels = wheels
self.miles = miles
self.make = make
self.model = model
self.year = year
self.base_sale_price = 10000
from abc import ABCMeta, abstractmethod
class Vehicle(object):
__metaclass__ = ABCMeta
base_sale_price = 0
wheels = 0
def __init__(self, miles, make, model, year):
self.miles = miles
self.make = make
self.model = model
self.year = year
def sale_price(self):
return 5000.0 * self.wheels
def purchase_price(self):
return self.base_sale_price - (.10 * self.miles)
@abstractmethod
def vehicle_type():
pass
class Car(Vehicle):
base_sale_price = 8000
wheels = 4
def vehicle_type(self):
return 'car'
class Truck(Vehicle):
base_sale_price = 10000
wheels = 4
def vehicle_type(self):
return 'truck'
class Motorcycle(Vehicle):
base_sale_price = 4000
wheels = 2
def vehicle_type(self):
return 'motorcycle'