PyClass

Today

Class Variables vs Instance Variables

class Dog(object):
    sound = "woof" # class variable

    def __init__(self, name):
        self.name = name # instance variable

    def bark(self):
        print Dog.sound

d = Dog("snowy")
d.bark()
    

Class Methods vs Instance Methods

class Dog(object):
    sound = "woof" # class variable

    def __init__(self, name):
        self.name = name # instance variable

    @classmethod # decorator
    def bark(cls):
        print Dog.sound

d = Dog("snowy")
d.bark()

# This works too! Only because it's a class method.
Dog.bark()
    

Inheritance:

class Animal(object):
    @classmethod
    def speak(cls):
        print cls.sound

class Dog(Animal):
    sound = "woof"

class Cat(Animal):
    sound = "meow"

d = Dog()
d.speak()
    

Address Book v1:

class AddressBook(object):
    def __init__(self):
        self.entries = {}

a = AddressBook()
a.entries["adit"] = "bluemangroupie@gmail.com"

if "adit" in a.entries:
    print "address exists"
else:
    print "nothing found."
    

Address Book v2:

Now with encapsulation!

class AddressBook(object):
    def __init__(self):
        self.entries = {}

    def add_entry(self, name, email):
        self.entries[name] = email

    def find(self, name):
        return self.entries.get(name, "nothing found.")
    

Address Book v3:

class Entry(object):
    def __init__(self, name, email="", phone="", address=""):
        self.name = name
        self.email = email
        self.phone = phone
        self.address = address

class AddressBook(object):
    def __init__(self):
        self.entries = []

    def add_entry(self, name, email="", phone="", address=""):
        self.entries += [Entry(name, email, phone, address)]

    def find(self, name):
        for entry in self.entries:
            if entry.name == name:
                return entry
        return None