\documentclass[14pt,compress,aspectratio=169]{beamer}

\input{macros.tex}

\title[OOP Inheritance]{Advanced Python}
\subtitle{Object Oriented Programming: Inheritance}

\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 a new \lstinline{Talk} class
  \item Puts together data and methods
  \item Can make instances of the class
  \item Each instance has its own data
  \item Objects encapsulate data and behavior
  \end{itemize}
\end{frame}

\begin{frame}[fragile, plain]
  \frametitle{Recap: the Talk class}
  \vspace*{-0.1in}
  \begin{lstlisting}
class Talk:
    """A class for the Talks."""
    def __init__(self, speaker, title, tags):
        self.speaker = speaker
        self.title = title
        self.tags = tags

    def get_speaker_firstname(self):
        return self.speaker.split()[0]

    def get_tags(self):
        return self.tags.split(',')
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Instantiating a class to create objects}
  \begin{lstlisting}
In []: bdfl = Talk('Guido van Rossum',
  ...:             'The History of Python',
  ...:             'python,history,C,advanced')
In []: bdfl.get_tags()
In []: bdfl.get_speaker_firstname()
In []: bdfl.tags

In []: type(bdfl)
  \end{lstlisting}
\end{frame}


\begin{frame}[fragile]
  \frametitle{Classes: the big picture}
  \begin{itemize}
  \item Lets you create new data types
  \item Class is a template for an object belonging to that class
  \item Instantiating a class creates an instance (an object)
  \item An instance encapsulates the state (data) and behavior
    (methods)
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Objects and Methods}
  \begin{itemize}
  \item Objects group data with functions
  \item Everything in Python is an object
  \item Strings, lists, functions and even modules
  \end{itemize}
  \begin{lstlisting}
    s = "Hello World"
    s.lower()

    l = [1, 2, 3, 4, 5]
    l.append(6)
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Classes}
  \begin{lstlisting}
In []: s = "Hello World"
In []: type(s)
  \end{lstlisting}
  \begin{itemize}
  \item A new string, comes along with methods
  \item A template or a blue-print, where these definitions lie
  \item This blue print for building objects is called a
    \lstinline{class}
  \item \lstinline{s} is an object of the \lstinline{str} class
  \item An object is an ``instance'' of a class
  \end{itemize}
\end{frame}


\begin{frame}[fragile]
  \frametitle{Classes: inheritance}
  \begin{itemize}
  \item Allows you to define an inheritance hierarchy
    \begin{itemize}
    \item ``A Honda car \alert{is a} car.''
    \item ``A car \alert{is an} automobile.''
    \item ``A Python \alert{is a} reptile.''
    \end{itemize}
  \item All data/behavior of a car should be there in a ``Honda'' car
  \item All data/behavior associated with a reptile ought to inhere in a snake
  \end{itemize}
\end{frame}


\begin{frame}[fragile]
  \frametitle{Inheritance}
  \vspace*{-0.1in}
  \begin{itemize}
  \item Suppose, we wish to write a \lstinline{Tutorial} class
  \item It's almost same as \lstinline{Talk} except for minor differences
  \item We can ``inherit'' from \lstinline{Talk}
  \end{itemize}
  \pause
  \begin{lstlisting}
class Tutorial(Talk):
    """A class for the tutorials."""
    def __init__(self, speaker, title, tags,
                 needs_computer=True):
        super().__init__(speaker, title, tags)
        self.needs_computer = needs_computer
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Inheritance}
  \vspace*{-0.1in}
  \begin{itemize}
  \item Modified \lstinline{__init__} method
  \item Inherits: \lstinline{get_tags} and
    \lstinline{get_speaker_firstname}
  \end{itemize}
  \begin{lstlisting}
tut = Tutorial('Travis Oliphant',
               'Numpy Basics',
               'numpy,python,beginner')
tut.get_speaker_firstname()
tut.needs_computer
  \end{lstlisting}
\end{frame}

\begin{frame}
  \frametitle{Some points}
  \begin{itemize}
  \item \lstinline{Tutorial} is a subclass (or child) of \lstinline{Talk}
  \item \lstinline{Talk} is the base class (or parent class)
  \item Only the \lstinline{__init__} has been changed
  \item This is called overriding
  \item \lstinline{super} ensures that the parent class is called
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Exercise: try this}
\begin{lstlisting}
class Tutorial(Talk):
    def __init__(self, speaker, title, tags,
                 needs_computer=True):
        self.needs_computer = needs_computer

In []: t = Tutorial('G v R', 'Python', 'py,tut')

In []: t.needs_computer

In []: t.speaker

In []: t.get_speaker_firstname())

\end{lstlisting}
\end{frame}

\begin{frame}
  \frametitle{Inheritance}
  \begin{itemize}
  \item A \lstinline{Tutorial} is a \lstinline{Talk}
  \item A \lstinline{Talk} is not a \lstinline{Tutorial}
  \item The sentence above should make sense!
  \item A \lstinline{Cat} is an \lstinline{Animal}
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Incorrect inheritance}
  \begin{itemize}
  \item A \lstinline{Talk} is a \lstinline{Speaker} or
  \item A \lstinline{Speaker} is a \lstinline{Room}
  \item Something is wrong in your OO design!
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Summary}
  \begin{itemize}
  \item Inheritance
  \item The importance of making sense
  \item The \lstinline{super} function
  \end{itemize}
\end{frame}



\end{document}
