summaryrefslogtreecommitdiff
path: root/advanced_python/09_oop_containership.tex
diff options
context:
space:
mode:
authorPrabhu Ramachandran2018-05-15 21:27:57 +0530
committerPrabhu Ramachandran2018-05-15 21:27:57 +0530
commit9132e564c5f28f1b10d66d8323ad765f9d914231 (patch)
tree677edccb6687c8d13f1b3914c896c3a6e8ea55cd /advanced_python/09_oop_containership.tex
parente805f9daa6c91a88fe7c0106db32369b457eda63 (diff)
downloadpython-workshops-9132e564c5f28f1b10d66d8323ad765f9d914231.tar.gz
python-workshops-9132e564c5f28f1b10d66d8323ad765f9d914231.tar.bz2
python-workshops-9132e564c5f28f1b10d66d8323ad765f9d914231.zip
Cleanup the numbering for advanced slides.
Diffstat (limited to 'advanced_python/09_oop_containership.tex')
-rw-r--r--advanced_python/09_oop_containership.tex207
1 files changed, 207 insertions, 0 deletions
diff --git a/advanced_python/09_oop_containership.tex b/advanced_python/09_oop_containership.tex
new file mode 100644
index 0000000..6434819
--- /dev/null
+++ b/advanced_python/09_oop_containership.tex
@@ -0,0 +1,207 @@
+\documentclass[14pt,compress,aspectratio=169]{beamer}
+
+\input{macros.tex}
+
+\title[OOP containership]{Advanced Python}
+\subtitle{Object Oriented Programming: containership }
+
+\author[FOSSEE] {The FOSSEE Group}
+
+\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}
+\date[] {Mumbai, India}
+
+\begin{document}
+
+\begin{frame}
+ \titlepage
+\end{frame}
+
+\begin{frame}
+ \frametitle{Recap}
+ \begin{itemize}
+ \item Created \lstinline{Talk} and \lstinline{Tutorial} classes
+ \item Know how to create objects: instantiation of a class
+ \vspace*{0.5in}
+
+ \item Let us create a conference!
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Conference class}
+ \vspace*{-0.1in}
+\begin{lstlisting}
+class Conference:
+ def __init__(self, talks=None):
+ if talks is None:
+ talks = []
+ self.talks = talks
+
+ def add_talk(self, talk):
+ self.talks.append(talk)
+
+ def schedule(self):
+ for talk in self.talks:
+ print(talk.speaker, talk.title)
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Using this}
+\begin{lstlisting}
+In []: c = Conference()
+
+In []: t = Talk('Guido', 'Python4', 'py,core')
+
+In []: c.add_talk(t)
+
+In []: c.schedule()
+
+\end{lstlisting}
+ \begin{itemize}
+ \item Easy to read
+ \item Nicely split up
+ \item Reflects the real world
+
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{But why not this?}
+\begin{lstlisting}
+class Conference:
+ def __init__(self, talks=[]):
+ self.talks = talks
+\end{lstlisting}
+ \begin{itemize}
+ \item Easier
+ \item Less code
+ \item Let's try it!
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Gotcha!}
+\begin{lstlisting}
+In []: c1 = Conference()
+In []: c1.add_talk(1)
+In []: c1.talks
+
+In []: c2 = Conference()
+In []: c2.talks
+
+\end{lstlisting}
+
+ \begin{itemize}
+ \item What is going on?
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Beware of mutable default arguments!}
+ \begin{itemize}
+ \item Default arguments are evaluated once
+ \item When the method/function is defined
+ \item So, if the object is mutable we have a problem
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Which is why we have this}
+\begin{lstlisting}
+class Conference:
+ def __init__(self, talks=None):
+ if talks is None:
+ talks = []
+ self.talks = talks
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Containership}
+ \begin{itemize}
+ \item \lstinline{Conference} class manages all the talks
+ \item It contains the talks and tutorials
+ \item Allows us to build complexity by \alert{composition}
+ \item Hierarchical organization
+ \item Allows us to mirror the real objects in code
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Some more examples}
+ \begin{itemize}
+ \item OOP for a \lstinline{Company}
+ \item OOP for a \lstinline{Bank}
+ \item OOP for a \lstinline{School} or \lstinline{College}
+ \item OOP for a cell phone, computer, ...
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Design guidelines}
+ \begin{itemize}
+ \item Important to make sense
+ \item Should be easy to explain the relationships and responsibilities of
+ each class
+ \item Inheritance should ``read'' correctly and make sense
+ \item No object should be too responsible
+ \item Functionality should be suitably delegated
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Summary}
+ \begin{itemize}
+ \item Creating a more complex class
+ \item Containing other objects
+ \item Issue with mutable default arguments
+ \item Important design guidelines
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[plain, fragile]
+ \frametitle{Exercise: Create a Zoo}
+ \begin{block}{}
+ Create a \py{Zoo} class which allows someone to add any number of animals.
+ This means it should work for \py{Animal, Mammal, Human} objects. It
+ should have a single \py{greet} method which calls the greet method of all
+ of the animals it has and prints that:
+ \end{block}
+
+\begin{lstlisting}
+In []: b = Animal('crow')
+In []: m = Mammal('dog', legs=4)
+In []: h = Human('Abhinav')
+In []: z = Zoo(b, m, h)
+In []: z.greet()
+crow says greet
+dog says greet
+Abhinav says hello
+\end{lstlisting}
+\end{frame}
+
+
+\begin{frame}[plain, fragile]
+ \frametitle{Solution}
+\begin{lstlisting}
+class Zoo:
+ def __init__(self, *animals):
+ self.animals = list(animals)
+
+ def greet(self):
+ for animal in self.animals:
+ print(animal.greet())
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Observations}
+ \begin{itemize}
+ \item Notice the abstraction of \py{Animal}
+ \item The \py{Zoo} will work with any object that has the \py{greet} method
+ \item That is, any \py{Animal}
+ \end{itemize}
+\end{frame}
+
+\end{document}