## 30. Object-Oriented Programming: "dot" notation

We are soon going to learn about a modern programming style called Object-Oriented Programming [OOP]. Python is an OOP language, although you could never have guessed from what we have seen up to now. Before we start writing object-oriented programs, we will first learn how to read and understand the notation used.

### All in a dog's day

Fido is a dog. During a typical day, he does various actions: he eats, runs, sleeps, etc. Here's how an object-oriented programmer might write this.

    Fido = Dog()
    Fido.eats()
    Fido.runs()
    Fido.sleeps()

In addition, Fido has various qualities or attributes. These are variables, like we have seen before except that they "belong" to Fido. He is tall (for a dog) and his hair is black. Here's how the programmer might write the same things.

    Fido.size = "tall"
    Fido.hair_colour = "black"

In the object-oriented language, we have the following:

- `Dog` is an example of a class (of objects).
- `Fido` is an instance (or particular object) in the `Dog` class.
- A class can be thought of as a special function which creates instances.
- `eats(), runs()` and `sleeps()` are methods of the `Dog` class; 'methods' are essentially like 'functions' which we saw before (the only difference is that they belong in a given class/instance).
- `size` and `hair_colour` are attributes of a given instance/object; attributes can take any value that a "normal" variable can take.
- The connection between the attributes or the methods with the object is indicated by a "dot" (".") written between them.

Objects can also have other objects that belong to them, each with their own methods or attributes:

    Fido.tail.wags()
    Fido.tail.type = "bushy"
    Fido.left_front_paw.moves()
    Fido.head.mouth.teeth.canine.hurt()

We'll see how this works later. For now, let's see how Reeborg can use the "dot" notation.

### A used robot get his name

So far, all the programs we wrote instructing Reeborg to accomplish tasks have been written without using the Object-Oriented Programming (OOP) notation. Let's start with a simple example.

First, we start by having an empty world, removing the robot if needed by pressing the add/remove robot button

Now, you might remember that RUR in RUR-PLE stands for: Roberge's Used Robot; the robots we use are old and faulty. [We will learn how to fix them later.] So, we will create our first instance of the `UsedRobot` class and name it, appropriately, Reeborg! We will then instruct it to take one step and then turn itself off.

    Reeborg = UsedRobot()
    Reeborg.move()
    Reeborg.turn_off()

Try it!

### More robots

Just like functions can have arguments, methods can too. Start with an empty world and try the following:

    # add robot at origin [by default], but with more interesting colour
    Larry = UsedRobot(colour='blue')
    # second robot, default colour (grey) facing North
    Curly = UsedRobot(1, 3, 'N')
    #  Third robot carries beepers
    Moe = UsedRobot(1, 2, beepers=9, colour='yellow')

    Larry.move()
    Curly.move()
    Moe.move()
    Larry.move()
    Curly.move()
    Moe.move()

    Curly.turn_left()
    Larry.move()
    Curly.move()
    # Turning off any one robot ends the program
    Moe.turn_off()

Robots come in a variety of colours: grey (by default), yellow, blue, light blue, green and purple. They can be positioned anywhere in the world (with more than one robot at the same intersection), face any of the four directions ('E' [by default], 'N', 'S', 'W') or carry a number of beepers from the start. Note that there are two named arguments (beepers and colour) and three unnamed ones (street, avenue and orientation). The two named arguments must appear last (their order may be interchanged if we write their name); the three unnamed arguments, if they appear, must appear in the same order. Thus, if we want to specify an orientation (say 'N'), we must first specify a street and an avenue so that the orientation is the third argument.

The following are allowed declarations:

    R1 = UsedRobot(2) # created at 2nd street, 1st avenue, facing East
    R2 = UsedRobot(2, 3) # 2nd street, 3rd avenue, facing East
    R3 = UsedRobot(3, 1, 'S') # 3rd steet, 1st avenue, facing South
    R4 = UsedRobot(5, colour='yellow') # 5th street, 1st avenue, facing East

The following declarations are not allowed:

    R5 = UsedRobot(3, 'S') # orientation is not 3rd argument
    R6 = UsedRobot(colour='yellow', 5) # unnamed argument listed after named one

What's your name? - - Globalization is a bad thing