Classes, Constructors, and Attributes

my_variable = "My value"
my_variable = [10, 20, 19, 5, 0]

Object Oriented Programming

  • Group multiple variables together in a single record
  • Associate functions (methods) to work with a group of data (object)
  • Use inheritance to extend a base set of code with new functionality

Using Classes and Objects to Group Data

name = "Link"
outfit = "Green"
max_hit_points = 50
current_hit_points = 50
armor_amount = 6
max_speed = 10
def display_character(name, outfit, max_hit_points, current_hit_points, armor, max_speed):
    print(name, outfit, max_hit_points, current_hit_points)

Defining Classes

class Character:
    """
    This is a class that represents the player character.
    """

Defining the

__init__

function

class Character:
    """
    This is a class that represents the player character.
    """
    def __init__(self):
        """ This is a method that sets up the variables in the object. """

Defining Class Attributes

class Character:
    """
    This is a class that represents the player character.
    """
    def __init__(self):
        """ This is a method that sets up the variables in the object. """
        self.name = ""
        self.outfit = ""
        self.max_hit_points = 0
        self.current_hit_points = 0
        self.armor_amount = 0
        self.max_speed = 0
class Address:
    """ Hold all the fields for a mailing address. """
    def __init__(self):
        """ Set up the address fields. """
        self.name = ""
        self.line1 = ""
        self.line2 = ""
        self.city = ""
        self.state = ""
        self.zip = ""

Creating Objects

def main():
    # Create an address
    home_address = Address()
def main():
    # Create an address
    home_address = Address()

    # Set the fields in the address
    home_address.name = "John Smith"
    home_address.line1 = "701 N. C Street"
    home_address.line2 = "Carver Science Building"
    home_address.city = "Indianola"
    home_address.state = "IA"
    home_address.zip = "50125"
def main():
    # Create an address
    home_address = Address()

    # Set the fields in the address
    home_address.name = "John Smith"
    home_address.line1 = "701 N. C Street"
    home_address.line2 = "Carver Science Building"
    home_address.city = "Indianola"
    home_address.state = "IA"
    home_address.zip = "50125"
    
    # Create another address
    vacation_home_address = Address()

    # Set the fields in the address
    vacation_home_address.name = "John Smith"
    vacation_home_address.line1 = "1122 Main Street"
    vacation_home_address.line2 = ""
    vacation_home_address.city = "Panama City Beach"
    vacation_home_address.state = "FL"
    vacation_home_address.zip = "32407"

    print("The client's main home is in " + home_address.city)
    print("His vacation home is in " + vacation_home_address.city)    

Common Mistakes

Creating Objects

class Address:
    def __init__(self):
        self.name = ""
        self.line1 = ""
        self.line2 = ""
        self.city = ""
        self.state = ""
        self.zip = ""

def main():
    # ERROR - Forgot the parentheses after Address
    my_address = Address
class Address:
    def __init__(self):
        self.name = ""
        self.line1 = ""
        self.line2 = ""
        self.city = ""
        self.state = ""
        self.zip = ""

def main():
    # Create an address
    my_address = Address()

    # Alert! This does not set the address's name!
    name = "Dr. Smith"

    # This doesn't set the name for the address either
    Address.name = "Dr. Smith"

    # This runs, creates a new attribute but with the wrong name.
    my_address.naem = "Dr. Smith"

    # This does work:
    my_address.name = "Dr. Smith"

main()

Using Objects in Functions

def print_address(address):
    """ Print an address to the screen """

    print(address.name)
    # If there is a line1 in the address, print it
    if len(address.line1) > 0:
        print(address.line1)
    # If there is a line2 in the address, print it
    if len(address.line2) > 0:
        print( address.line2 )
    print(address.city + ", " + address.state + " " + address.zip)


def main():
    # ... code for creating home_address and vacation_home_address
    # goes here.
    print_address(home_address)
    print()
    print_address(vacation_home_address)


main()

Customizing the Constructor

class Dog():
    def __init__(self):
        """ Constructor """

        self.name = ""


def main():
    my_dog = Dog()


main()
class Dog():
    def __init__(self):
        """ Constructor. Called when creating an object of this type. """
        self.name = ""

        print("A new dog is born!")


def main():
    # This creates the dog
    my_dog = Dog()
class Dog():

    def __init__(self, new_name):

        """ Constructor. Called when creating an object of this type. """

        self.name = new_name

        print("A new dog is born!")


def main():
    # This creates the dog
    my_dog = Dog()


main()
class Dog():
    def __init__(self, new_name):
        """ Constructor. Called when creating an object of this type. """
        self.name = new_name
        print("A new dog is born!")


def main():
    # This creates the dog

    my_dog = Dog("Fluffy")



main()
class Dog():

    def __init__(self, name):

        """ Constructor. Called when creating an object of this type. """

        self.name = name

        print("A new dog is born!")


def main():
    # This creates the dog
    my_dog = Dog("Fluffy")


main()

Typing Attributes

class Person:
    def __init__(self):
        self.name: str = "A"


mary = Person()
mary.name = 22

Data Classes

class Address:
    def __init__(self,
                 name: str = "",
                 line1: str = "",
                 line2: str = "",
                 city: str = "",
                 state: str = "",
                 zip_code: str = ""
                 ):
        self.name: str = name
        self.line1: str = line1
        self.line2: str = line2
        self.city: str = city
        self.state: str = state
        self.zip_code: str = zip_code
@dataclass
class Address:
    name: str = ""
    line1: str = ""
    line2: str = ""
    city: str = ""
    state: str = ""
    zip_code: str = ""

Static Variables

Class Attributes

  • Remember - Class attributes are variables that are part of a class.
  • Instance variables are different for each instance of an object.
  • Static variables are the same, no matter which object we reference. The data is shared between instances.
class Cat:

    population = 0


    def __init__(self, name):
        self.name = name

        Cat.population += 1


def main():
    cat1 = Cat("Pat")
    cat2 = Cat("Pepper")
    cat3 = Cat("Pouncy")


    print("The cat population is:", Cat.population)


main()
class Cat:

    population = 0


    def __init__(self, name):
        self.name = name

        Cat.population += 1


def main():
    cat1 = Cat("Pat")
    cat2 = Cat("Pepper")
    cat3 = Cat("Pouncy")


    print("The cat population is:", Cat.population)
    print("The cat population is:", cat1.population)


main()
class Cat:

    population = 0


    def __init__(self, name):
        self.name = name

        Cat.population += 1


def main():
    cat1 = Cat("Pat")
    cat2 = Cat("Pepper")
    cat3 = Cat("Pouncy")

    Cat.population = 4
    print("The cat population is:", Cat.population)
    print("The cat population is:", cat2.population)
    print("The cat population is:", cat1.population)


main()
class Cat:

    population = 0


    def __init__(self, name):
        self.name = name

        Cat.population += 1


def main():
    cat1 = Cat("Pat")
    cat2 = Cat("Pepper")
    cat3 = Cat("Pouncy")

    Cat.population = 4
    cat3.population = 5
    print("The cat population is:", Cat.population)
    print("The cat population is:", cat1.population)
    print("The cat population is:", cat2.population)
    print("The cat population is:", cat3.population)


main()

Review

Bundle data into a class

  • Class attributes
  • Instance variables
  • Fields

__init__

  • "Magic Method" called when object is created
  • Sets up instance variables
  • Assign default values

Refer to instance variables

  • Inside the class: self.name
  • Outside the class: customer.name

Classes Simplify Code

  • Represent character in video game
  • Graphs
  • A customer order

Review

  • "Data classes" can make it easier to define classes with a lot of attributes
  • Typing can help make sure we don't put the wrong type of data in an attribute
  • Static variables don't change from object to object

16 Classes, Constructors, and Attributes

By Paul Craven

16 Classes, Constructors, and Attributes

  • 1,172