oop added
This commit is contained in:
		
							parent
							
								
									5b32090a1d
								
							
						
					
					
						commit
						d25b6330b4
					
				
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 7.8 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 29 KiB  | 
| 
						 | 
					@ -41,8 +41,7 @@ The quote above is taken shamelessly from [wikipedia](https://en.wikipedia.org/w
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Writing code
 | 
					### Writing code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Scripts are text files, plain and simple.
 | 
					Scripts are text files, plain and simple.  So in order to **write** a Python3 script all we need is a text editor.
 | 
				
			||||||
So in order to **write** a Python3 script all we need is a text editor.
 | 
					 | 
				
			||||||
Nano, vim, notepad++ all do a good job of editing plain text files but some make it *easier* than others.
 | 
					Nano, vim, notepad++ all do a good job of editing plain text files but some make it *easier* than others.
 | 
				
			||||||
You've noticed that vim colors the code of a shell script no?
 | 
					You've noticed that vim colors the code of a shell script no?
 | 
				
			||||||
One of the many features of an [IDE](https://en.wikipedia.org/wiki/Integrated_development_environment) is *syntax highlighting*.
 | 
					One of the many features of an [IDE](https://en.wikipedia.org/wiki/Integrated_development_environment) is *syntax highlighting*.
 | 
				
			||||||
| 
						 | 
					@ -1825,6 +1824,7 @@ We already saw a dictionaries which are good mapping structures but how can we s
 | 
				
			||||||
A hacky way would be to write a python file containing the `dict` and `import` it when we need it.
 | 
					A hacky way would be to write a python file containing the `dict` and `import` it when we need it.
 | 
				
			||||||
But there are better ways.
 | 
					But there are better ways.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**TODO CSV**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Now for some useful scripting
 | 
					# Now for some useful scripting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1836,13 +1836,216 @@ Don't hesitate to ask for help!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Creating our own objects
 | 
					# Creating our own objects
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We've been using built-in objects like `str`, `int` and `float` but we can create our own objects as well!
 | 
				
			||||||
 | 
					You might wonder *why* you would do this and that's a valid reflection.
 | 
				
			||||||
 | 
					For beginners it's often a bit unclear when to create your own objects and when not.
 | 
				
			||||||
 | 
					We'll go over some abstract examples to showcase the syntax and usage, then do a couple of practical exercises.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## First some *abstract* examples
 | 
					## First some *abstract* examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TODO simple animal or vehicle exercise
 | 
					A basic abstraction can be seen below.
 | 
				
			||||||
 | 
					The main thing to take away from this code block is the new [keyword](https://docs.python.org/3/reference/compound_stmts.html#class-definitions) `class`.
 | 
				
			||||||
 | 
					Once the new `class` is defined, we can create an **instance** of this class.
 | 
				
			||||||
 | 
					We can create as many instances as we want, just as with `str`!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```python
 | 
				
			||||||
 | 
					class Animal(object):
 | 
				
			||||||
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dog = Animal()
 | 
				
			||||||
 | 
					dog.name = "bobby"
 | 
				
			||||||
 | 
					dog.legs = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print("the {} named {} has {} legs".format(
 | 
				
			||||||
 | 
					    dog.__class__.__name__,
 | 
				
			||||||
 | 
					    dog.name,
 | 
				
			||||||
 | 
					    dog.legs,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We can create as many attributes as we want and in the example above we do this for a `name` and a number of `legs`.
 | 
				
			||||||
 | 
					An `Animal` will *always* have a `name` and a number of `legs` so why don't we foresee their existence?
 | 
				
			||||||
 | 
					We can do this as follows.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```python
 | 
				
			||||||
 | 
					class Animal(object):
 | 
				
			||||||
 | 
					    def __init__(self, name, legs):
 | 
				
			||||||
 | 
					        self.name = name
 | 
				
			||||||
 | 
					        self.legs = legs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dog_1 = Animal("bobby", 4)
 | 
				
			||||||
 | 
					dog_2 = Animal("dianne", 4)
 | 
				
			||||||
 | 
					dog_3 = Animal("rex", 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all_my_dogs = [dog_1, dog_2, dog_3]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for dog in all_my_dogs:
 | 
				
			||||||
 | 
					    print("the {} named {} has {} legs".format(
 | 
				
			||||||
 | 
					        dog.__class__.__name__,
 | 
				
			||||||
 | 
					        dog.name,
 | 
				
			||||||
 | 
					        dog.legs,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now, objects don't just possess *attributes*, they can also *do* things!
 | 
				
			||||||
 | 
					Executing a piece of code should get you thinking about **functions**.
 | 
				
			||||||
 | 
					A function belonging to a `class` is called a **method** and we can easily create them!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```python
 | 
				
			||||||
 | 
					class Animal(object):
 | 
				
			||||||
 | 
					    def __init__(self, name, legs):
 | 
				
			||||||
 | 
					        self.name = name
 | 
				
			||||||
 | 
					        self.legs = legs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def speaks(self):
 | 
				
			||||||
 | 
					        print("barks ~~{}~~!".format(self.name.upper()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dog_1 = Animal("bobby", 4)
 | 
				
			||||||
 | 
					dog_2 = Animal("dianne", 4)
 | 
				
			||||||
 | 
					dog_3 = Animal("rex", 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all_my_dogs = [dog_1, dog_2, dog_3]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for dog in all_my_dogs:
 | 
				
			||||||
 | 
					    print("the {} named {} has {} legs".format(
 | 
				
			||||||
 | 
					        dog.__class__.__name__,
 | 
				
			||||||
 | 
					        dog.name,
 | 
				
			||||||
 | 
					        dog.legs,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    dog.speaks()
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And just as with functions defined outside of a `class` we can add arguments to our own methods.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```python
 | 
				
			||||||
 | 
					class Animal(object):
 | 
				
			||||||
 | 
					    def __init__(self, name, legs, owner):
 | 
				
			||||||
 | 
					        self.name = name
 | 
				
			||||||
 | 
					        self.legs = legs
 | 
				
			||||||
 | 
					        self.owner = owner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def speaks(self):
 | 
				
			||||||
 | 
					        print("barks ~~{}~~!".format(self.name.upper()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def jumps_on(self, person):
 | 
				
			||||||
 | 
					        if person == self.owner:
 | 
				
			||||||
 | 
					            print("{} licks {}'s face...".format(self.name, person))
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            print("{} growls in {}'s face".format(self.name, person))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dog_1 = Animal("bobby", 4, "dave")
 | 
				
			||||||
 | 
					dog_2 = Animal("dianne", 4, "alice")
 | 
				
			||||||
 | 
					dog_3 = Animal("rex", 3, "dave")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all_my_dogs = [dog_1, dog_2, dog_3]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for dog in all_my_dogs:
 | 
				
			||||||
 | 
					    print("the {} named {} has {} legs".format(
 | 
				
			||||||
 | 
					        dog.__class__.__name__,
 | 
				
			||||||
 | 
					        dog.name,
 | 
				
			||||||
 | 
					        dog.legs,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    dog.speaks()
 | 
				
			||||||
 | 
					    dog.jumps_on("alice")
 | 
				
			||||||
 | 
					    print("\t---\n")
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					🏃 Try it
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Think of some other world objects you can create a class for and do so.
 | 
				
			||||||
 | 
					The first one that comes to mind is vehicles but you can do anything that makes sense to you.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Class inheritance
 | 
					## Class inheritance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TODO shapes and surfaces
 | 
					Inheritance is one of the four main pillars of Object Orientated Programming.
 | 
				
			||||||
 | 
					The idea is pretty simple, classes can inherit behaviour from a *parent* class.
 | 
				
			||||||
 | 
					For example, `Dog` and `Cat` are both `Animal` so they share common attributes and methods.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```python
 | 
				
			||||||
 | 
					class Animal(object):
 | 
				
			||||||
 | 
					    def __init__(self, name, legs, owner):
 | 
				
			||||||
 | 
					        self.name = name
 | 
				
			||||||
 | 
					        self.legs = legs
 | 
				
			||||||
 | 
					        self.owner = owner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def jumps_on(self, person):
 | 
				
			||||||
 | 
					        if person == self.owner:
 | 
				
			||||||
 | 
					            print("{} licks {}'s face...".format(self.name, person))
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            print("{} growls in {}'s face".format(self.name, person))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Dog(Animal):
 | 
				
			||||||
 | 
					    CALL = "barks"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, name, legs=4, owner=None):
 | 
				
			||||||
 | 
					        Animal.__init__(self, name, legs, owner)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def speaks(self):
 | 
				
			||||||
 | 
					        print("{} ~~{}~~!".format(self.__class__.CALL, self.name.upper()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Cat(Animal):
 | 
				
			||||||
 | 
					    CALL = "miauws"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, name, legs=4, owner=None):
 | 
				
			||||||
 | 
					        Animal.__init__(self, name, legs, owner)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def speaks(self):
 | 
				
			||||||
 | 
					        print("{} ~~{}~~!".format(self.__class__.CALL, self.name.lower()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Parrot(Animal):
 | 
				
			||||||
 | 
					    CALL = "creaks"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, name, legs=2, owner=None):
 | 
				
			||||||
 | 
					        Animal.__init__(self, name, legs, owner)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def speaks(self):
 | 
				
			||||||
 | 
					        print("{} ~~{}~~!".format(self.__class__.CALL, self.name.lower()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def jumps_on(self, person):
 | 
				
			||||||
 | 
					        print("you're silly, I'm a {}, I don't jump...".format(
 | 
				
			||||||
 | 
					            self.__class__.__name__)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					animal_1 = Dog(name="bobby", owner="dave")
 | 
				
			||||||
 | 
					animal_2 = Dog(name="dianne", owner="alice")
 | 
				
			||||||
 | 
					animal_3 = Cat("garfield", 3, "dave")
 | 
				
			||||||
 | 
					animal_4 = Parrot("coco", "alice")
 | 
				
			||||||
 | 
					animal_5 = Cat("gertrude", 3, "dave")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all_animals = [animal_1, animal_2, animal_3, animal_4, animal_5]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for animal in all_animals:
 | 
				
			||||||
 | 
					    print("the {} named {} has {} legs".format(
 | 
				
			||||||
 | 
					        animal.__class__.__name__,
 | 
				
			||||||
 | 
					        animal.name,
 | 
				
			||||||
 | 
					        animal.legs,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    animal.speaks()
 | 
				
			||||||
 | 
					    animal.jumps_on("alice")
 | 
				
			||||||
 | 
					    print("\t---\n")
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					🏃 Try it
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Take the additional class yyou made, such as vehicle and do some inheritance.
 | 
				
			||||||
 | 
					For vehicles you could create a base class with a brand and number of wheels and seats.
 | 
				
			||||||
 | 
					Then inherit for a bus, bike, car, cycle, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**TODO shapes and surfaces**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Now some *practical* improvements
 | 
					## Now some *practical* improvements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1905,6 +2108,3 @@ TODO add a countdown timer to the multiple choice game
 | 
				
			||||||
# Coding challenge - Login generator with GUI
 | 
					# Coding challenge - Login generator with GUI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Coding challenge - Trivial pursuit with GUI
 | 
					# Coding challenge - Trivial pursuit with GUI
 | 
				
			||||||
 | 
					 | 
				
			||||||
# Introduction to the `logging` library
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue