From d25b6330b42eb6db8b40df6c7bd7525d8e2eecd8 Mon Sep 17 00:00:00 2001 From: waldek Date: Wed, 10 Nov 2021 13:48:59 +0100 Subject: [PATCH] oop added --- assets/plan.FCStd | Bin 0 -> 29873 bytes assets/plan.FCStd1 | Bin 0 -> 18525 bytes assets/plan_3d.png | Bin 0 -> 7951 bytes assets/plan_topview.png | Bin 0 -> 30033 bytes learning_python3.md | 214 ++++++++++++++++++++++++++++++++++++++-- 5 files changed, 207 insertions(+), 7 deletions(-) create mode 100644 assets/plan.FCStd create mode 100644 assets/plan.FCStd1 create mode 100644 assets/plan_3d.png create mode 100644 assets/plan_topview.png diff --git a/assets/plan.FCStd b/assets/plan.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..f4863f39c09be4d1d6375a594e6982419b00b32b GIT binary patch literal 29873 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
    x08Qh%4>m$Hee4s24d#7HQf-~GY^c63ka{;D> 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 literal 0 HcmV?d00001 diff --git a/assets/plan.FCStd1 b/assets/plan.FCStd1 new file mode 100644 index 0000000000000000000000000000000000000000..8bb9fb7f008e8954b0f165826489b4af22f2bec7 GIT binary patch literal 18525 zcmZ^~V~{8@_wGC99^1BUn|o~Awr$(CZQGtbwr%UoTmN(Gp7-3kAJR#sR%N9+o&K$7 zby`je7z7yr00062NXtUeSnZz|9vlEbS3Us1pWj|#TSI4SV;d)0H*2daZB5$^c2u96 z+PU}Q&OQxP=hS$oI96*ie$H`biTP&|IV;ZjC?br8td@_9mpDXY2~uOqo+zTu(?Fta zIJjO%0(ZB^joH!q`=A4J_~6mn_=;{7JNB>;0XN@IkCdp6>x-T3F3xw=)(^=yc*D=@ zLnV%AutqU#(jVm#bSgLr#`I^;ZahApGNLht+fcsSY|P=83G#^KQSuQ<_<>n5K7Uaq zW$)!H!Q?8`Ba2%H$I_rQo(JTEynrrUx-#oPw^wg8gFoivo ztO<+wK0e@7L_TOd3FB3jw!EC214(}-68UlfgC%*c>nET=)U9myLwj3RbfUgM;C5`< zMf9E&%~UNi;;z_ZVzPh?9U!VLInN1SYqg20Yc0Kzylo{v8~6U5`dshq)o4=Zk=9YdFV1>&3?Pn_w6YqkX?`+8F8!Z?|u`cQ!?c2ze2)c z&C0K5X3m~m>>?6|@I&p%eIb0}NZ-=mhW|N_@Aa75*l22PoxQpuQ=78iec*UcHp4kW{%Z%Z$l|A!2Y`~C z&CF($Mj2E#n%z1NKV+b?TGc>dG@lK=_&`Wu0YJFIwplIVj+iDqBgyDfLh5`{vIIKWIaP*(1Sw5Vic^a=%aNAm&xqxh znN;wJl{9oDGzx?y0phP`yvr4+mg$=55~x{Bh7u`mnTgeiKfSzk;f= z%>BO#5)sOmu8UQn}M@4!9BtoOlV&3wvd~I#e{1AUfWlHI9mnEOet1 z2{IKTL0~DoRW$#~K@|DostQ%mJxBC77g&&hAg)-(%#(1Ff{~l2tQdy3i8Hk|mNqLG zcQnw-8^{Lo^RDsmSH=BKG#Te- zn9|Fv@&A&lw<8!E${g%iSt?}Va%ATm)VmlMnsDW|>;;l2A{RZ3NnakvA≪6rZLc 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 bK>!F(GXtkLfocR8+=^0DogG~iU|AOcG%^Rg literal 0 HcmV?d00001 diff --git a/assets/plan_3d.png b/assets/plan_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..7f133b022dede2d580d7c24c50933cbbe9154d8b GIT binary patch literal 7951 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 P&V$U1t&Q#(5U>0XF68SL literal 0 HcmV?d00001 diff --git a/assets/plan_topview.png b/assets/plan_topview.png new file mode 100644 index 0000000000000000000000000000000000000000..8a50e511d979f128e4db6d79d90be92182b2ffdb GIT binary patch literal 30033 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 literal 0 HcmV?d00001 diff --git a/learning_python3.md b/learning_python3.md index 7109132..6c9c821 100644 --- a/learning_python3.md +++ b/learning_python3.md @@ -41,8 +41,7 @@ The quote above is taken shamelessly from [wikipedia](https://en.wikipedia.org/w ### Writing code -Scripts are text files, plain and simple. -So in order to **write** a Python3 script all we need is a text editor. +Scripts are text files, plain and simple. 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. 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*. @@ -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. But there are better ways. +**TODO CSV** # Now for some useful scripting @@ -1836,13 +1836,216 @@ Don't hesitate to ask for help! # 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 -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 -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 @@ -1905,6 +2108,3 @@ TODO add a countdown timer to the multiple choice game # Coding challenge - Login generator with GUI # Coding challenge - Trivial pursuit with GUI - -# Introduction to the `logging` library -