diff --git a/oop/oop.pdf b/oop/oop.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..051d6a9c43551f343faff2c46f54fe6c3cc47df5
Binary files /dev/null and b/oop/oop.pdf differ
diff --git a/oop/oop.tex b/oop/oop.tex
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ba91e673ad2bf5448052a706b90691c06c1afce0 100644
--- a/oop/oop.tex
+++ b/oop/oop.tex
@@ -0,0 +1,410 @@
+\documentclass{beamer}
+
+\usepackage{color}
+\usepackage{graphicx}
+\usepackage{minted}
+\usepackage{url}
+
+\definecolor{pms280}{HTML}{00247d}
+\definecolor{pms280_2nd}{HTML}{385499}
+\definecolor{pms280_4th}{HTML}{7185b6}
+\definecolor{pms280_8th}{HTML}{e2e6F0}
+\definecolor{pms280_compl}{HTML}{7d5800}
+
+\usetheme{Boadilla}
+\useoutertheme{infolines}
+\useinnertheme{circles}
+\setbeamercolor{author in head/foot}{bg=pms280,fg=white}
+\setbeamercolor{title in head/foot}{bg=pms280_2nd,fg=white}
+\setbeamercolor{date in head/foot}{bg=pms280_4th,fg=white}
+\setbeamercolor{block title}{bg=pms280,fg=white}
+\setbeamercolor{block body}{bg=pms280_8th}
+\setbeamercolor{title}{fg=pms280}
+\setbeamercolor{titlelike}{fg=pms280}
+\setbeamercolor{itemize item}{fg=pms280}
+\setbeamercolor{itemize subitem}{fg=pms280}
+\setbeamertemplate{enumerate items}[default]
+\setbeamercolor{enumerate item}{fg=pms280}
+
+\author{Jonathan~K.~Vis}
+\institute[LUMC]{Dept. of Human Genetics, Leiden University Medical Center}
+\date{September 21st, 2017}
+\title{Object Oriented Programming}
+
+\begin{document}
+\beamertemplatenavigationsymbolsempty
+
+\begin{frame}
+\titlepage
+\end{frame}
+
+\begin{frame}[fragile]{Organizing data}
+
+\begin{itemize}
+\item Lists:
+\begin{minted}{python}
+vectors_x = [0, 1, 2]
+vectors_y = [0, 1, 1]
+>>> (vectors_x[2], vectors_y[1])
+(2, 1)
+\end{minted}
+
+\item Nested lists:
+\begin{minted}{python}
+vectors = [[0, 0], [1, 1], [2, 1]]
+>>> vectors[2]
+[2, 1]
+\end{minted}
+
+\item Dictionaries:
+\begin{minted}{python}
+vectors = [{'x': 0, 'y': 0},
+           {'x': 1, 'y': 1},
+           {'x': 2, 'y': 1}]
+>>> vectors[2]
+{'y': 1, 'x': 2}
+\end{minted}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{Everything is an object}
+\begin{itemize}
+\item Python supports many different kinds of data:
+\begin{minted}{python}
+42    3.14159    'Hello World!'    [1, 1, 2, 3, 5, 8]
+{'name': 'Jack', 'age': 25}    True
+\end{minted}
+
+\item every \textcolor{pms280_compl}{object} has:
+\begin{itemize}
+\item a \textcolor{pms280_compl}{type};
+\item an internal \textcolor{pms280_compl}{data representation}
+(primitive or composite);
+\item a set of \textcolor{pms280_compl}{procedures} (functions) for
+interaction.
+\end{itemize}
+
+\item an object is an \textcolor{pms280_compl}{instance} of a type:
+\begin{itemize}
+\item \mintinline{python}{42} is an instance of type
+\mintinline{python}{int};
+\item \mintinline{python}{'Hello World!'} is an instance of type
+\mintinline{python}{string}.
+\end{itemize}
+\end{itemize}
+\end{frame}
+
+\begin{frame}{Object oriented programming}
+\begin{itemize}
+\item \textcolor{pms280_compl}{create} new objects;
+\item \textcolor{pms280_compl}{manipulate} objects;
+\item \textcolor{pms280_compl}{destroy} objects:
+\begin{itemize}
+\item explicitly \mintinline{python}{del};
+\item or just ``forget'' about them: Python will destroy inaccessible
+objects in a process called \textcolor{pms280_compl}{garbage collection}.
+\end{itemize}
+\end{itemize}
+
+Objects are \textcolor{pms280_compl}{data abstraction}:
+\begin{enumerate}
+\item internal data representation using
+\textcolor{pms280_compl}{attributes} (member variables);
+\item an interface (for interaction):
+\begin{itemize}
+\item procedures (member functions);
+\item defines behaviour, but hides implementation.
+\end{itemize}
+\end{enumerate}
+\end{frame}
+
+\begin{frame}{Working with objects}
+\begin{enumerate}
+\item creating a \mintinline{python}{class}:
+\begin{itemize}
+\item define the \mintinline{python}{class} name;
+\item define the \mintinline{python}{class} attributes (member
+functions).
+\end{itemize}
+
+\item using the \mintinline{python}{class}:
+\begin{itemize}
+\item create new \textcolor{pms280_compl}{instances} of a class;
+\item manipulating these instances.
+\end{itemize}
+
+\end{enumerate}
+\end{frame}
+
+\begin{frame}[fragile]{Define your own types}
+Use the keyword \mintinline{python}{class} to define a new type:
+\begin{itemize}
+\item with as parent the \mintinline{python}{object} type;
+\item and \textcolor{blue}{\mintinline{python}{Vector}} as name.
+\end{itemize}
+
+\bigskip
+
+\begin{minted}{python}
+class Vector(object):
+    """2d vector class."""
+
+    def __init__(self, x=0, y=0):
+        """Initializes a new 2d vector; default: (0, 0)."""
+        self.x = x
+        self.y = y
+\end{minted}
+\end{frame}
+
+\begin{frame}{More on attributes}
+Data and procedures (functions) that ``belong'' to the class:
+
+\begin{itemize}
+\item \textcolor{pms280_compl}{Data} attributes: the objects that make up
+the class;
+\item a 2d vector is made up of two numbers (\mintinline{python}{x} and
+\mintinline{python}{y}).
+\item \textcolor{pms280_compl}{Methods} (procedures);
+\item functions that \emph{only} work with this class;
+\item how to interact with the object;
+\item e.g., calculate the length of a vector.
+\end{itemize}
+
+\bigskip
+
+\mintinline{python}{self} is the current instance of a class.
+
+\bigskip
+
+\mintinline{python}{def __init__(self, ...)} is a special method to
+create new instances of a class.
+\end{frame}
+
+\begin{frame}[fragile]{Creating an instance of a class}
+\begin{minted}{python}
+origin = Vector()
+v1 = Vector(2, 1)
+print v1.x, origin.y
+\end{minted}
+
+\bigskip
+
+\begin{itemize}
+\item don't provide anything for the \mintinline{python}{self} argument;
+Python does that automatically;
+\item use the \textcolor{pms280_compl}{dot} to access an attribute of an
+instance;
+\item \mintinline{python}{.x} is a member variable.
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{Hiding information --- separation of concern}
+\begin{itemize}
+\item Sometimes we would like to \textcolor{pms280_compl}{hide}
+attributes to the outside world, i.e., only usable inside the class.
+
+\item in Python we prefix an attribute with \mintinline{python}{_}
+(underscore) to make it \textcolor{pms280_compl}{private}:
+\begin{minted}{python}
+class Vector(object):
+    def __init__(self, x=0, y=0):
+        self.x = x
+        self.y = y
+        self._secret = 42
+\end{minted}
+
+\item we agree not to access this attribute directly:
+\begin{minted}{python}
+>>> v1 = Vector(1, 2)
+>>> print v1._secret    # this is forbidden
+\end{minted}
+
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{Add a method to the \mintinline{python}{Vector} class}
+\begin{minted}{python}
+class Vector(object):
+    def __init__(self, x=0, y=0):
+        self.x = x
+        self.y = y
+
+    def distance(self, other):
+        dx = (self.x - other.x) ** 2
+        dy = (self.y - other.y) ** 2
+        return (dx + dy) ** .5
+\end{minted}
+
+\bigskip
+
+To use the newly created method:
+\begin{minted}{python}
+origin.distance(v1)
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Print representation of an object}
+\begin{minted}{python}
+>>> v1 = Vector(4, 3)
+>>> print v1
+<__main__.Vector object at 0x7f41ab878450>
+\end{minted}
+
+\bigskip
+
+\begin{itemize}
+\item per default \textcolor{pms280_compl}{uninformative};
+\item define the special method \mintinline{python}{def __str__(self)};
+\item Python class the \mintinline{python}{__str__} method automatically
+when using the \mintinline{python}{print} function;
+\item we are in control of what is printed, e.g., for the vector class:
+\begin{minted}{python}
+>>> print v1
+<4, 3>
+\end{minted}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{Own print method}
+The \mintinline{python}{__str__} function must return a string.
+
+\begin{minted}{python}
+class Vector(object):
+    def __init__(self, x=0, y=0):
+        self.x = x
+        self.y = y
+
+    def distance(self, other):
+        dx = (self.x - other.x) ** 2
+        dy = (self.y - other.y) ** 2
+        return (dx + dy) ** .5
+
+    def __str__(self):
+        return '<' + str(self.x) + ', ' + str(self.y) + '>'
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{More on types}
+\begin{itemize}
+\item get the type of an instance:
+\begin{minted}{python}
+>>> v1 = Vector(4, 3)
+>>> print type(v1)
+<class '__main__.Vector'>
+\end{minted}
+
+\item that also works for the class:
+\begin{minted}{python}
+>>> print type(Vector)
+<type 'type'>
+\end{minted}
+
+\item use \mintinline{python}{isinstance()} to check if an object is a
+vector:
+\begin{minted}{python}
+>>> print isinstance(v1, Vector)
+True
+\end{minted}
+
+\item what happens here:
+\begin{minted}{python}
+>>> print v1.distance(4)
+\end{minted}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{Special operators}
+\begin{itemize}
+\item define special operators like:
+\mintinline{python}{+,-,==,<,>,len(),...}
+see: \path{https://docs.python.org/2/reference/datamodel.html#basic-customization}
+
+\item these can be \textcolor{pms280_compl}{overloaded} to work with your
+class (keep it sensible);
+\item using the double underscore notation:
+\begin{minted}{python}
+__add__(self, other)  # self + other
+__sub__(self, other)  # self - other
+__eq__(self, other)   # self == other
+__lt__(self, other)   # self < other
+__len__(self)         # len(self)
+\end{minted}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{Example of an overloaded operator}
+\begin{minted}{python}
+class Vector(object):
+    ...
+
+    def __add__(self, other):
+        return Vector(self.x + other.x, self.y + other.y)
+\end{minted}
+
+\bigskip
+
+\begin{minted}{python}
+>>> v1 = Vector(1, -6)
+>>> v2 = Vector(3, 4.5)
+>>> print v1 + v2
+<4, -1.5>
+\end{minted}
+\end{frame}
+
+\begin{frame}{The power of OOP}
+\begin{itemize}
+\item \textcolor{pms280_compl}{Bundle} together objects that share:
+\begin{itemize}
+\item common (data) attributes;
+\item methods that manipulate these attributes.
+\end{itemize}
+
+\item \textcolor{pms280_compl}{Abstract away} implementation by
+specifying interfaces and behaviour;
+
+\item Use \textcolor{pms280_compl}{inheritance} (not covered) to give an
+even nicer abstraction;
+
+\item \textcolor{pms280_compl}{Create} own data type on top of what
+Python provides;
+
+\item \textcolor{pms280_compl}{Reuse} code: wrapping code in classes
+prevents collision of function names;
+
+\item Many \textcolor{pms280_compl}{libraries} heavily use classes.
+\end{itemize}
+
+\vfill
+
+\begin{center}
+\textcolor{pms280}{\Large \textbf{Questions?}}
+\end{center}
+\end{frame}
+
+\begin{frame}[fragile]{Assignment}
+\begin{minted}{python}
+class Fraction(object):
+    def __init__(self, numerator, denominator=1):
+        self.numerator = numerator
+        self.denominator = denominator
+\end{minted}
+
+\bigskip
+
+Use the skeleton to implement a \textcolor{pms280_compl}{Fraction} type
+containing two integers: \mintinline{python}{numerator} and
+\mintinline{python}{denominator}.
+
+\begin{itemize}
+\item add, subtract;
+\item print representation, convert to \mintinline{python}{float};
+\item invert a fraction;
+\item $\ldots$
+\end{itemize}
+
+\bigskip
+
+see: \path{https://link.com/assignment}
+\end{frame}
+
+\end{document}