diff options
author | Prabhu Ramachandran | 2017-11-27 01:23:26 +0530 |
---|---|---|
committer | Prabhu Ramachandran | 2017-11-27 01:23:26 +0530 |
commit | 205ea4d7aa19ef34b112fd5081000a3fd21b95bd (patch) | |
tree | b437a945190d8e824aacdb9671828a5e68719193 /advanced_python/10_oop_classattr.tex | |
parent | 87e2b74b18194060ed14e7744ed59d46f3c1b98a (diff) | |
download | python-workshops-205ea4d7aa19ef34b112fd5081000a3fd21b95bd.tar.gz python-workshops-205ea4d7aa19ef34b112fd5081000a3fd21b95bd.tar.bz2 python-workshops-205ea4d7aa19ef34b112fd5081000a3fd21b95bd.zip |
Adding slides on OOP class attributes and misc.
Diffstat (limited to 'advanced_python/10_oop_classattr.tex')
-rw-r--r-- | advanced_python/10_oop_classattr.tex | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/advanced_python/10_oop_classattr.tex b/advanced_python/10_oop_classattr.tex new file mode 100644 index 0000000..4548de1 --- /dev/null +++ b/advanced_python/10_oop_classattr.tex @@ -0,0 +1,204 @@ +\documentclass[14pt,compress,aspectratio=169]{beamer} + +\input{macros.tex} + +\title[OOP: Class Attributes]{Advanced Python} +\subtitle{Object Oriented Programming: class attributes} + +\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 Classes for encapsulation + \item Inheritance + \item \py{super,isinstance,issubclass} + \item Containership + \vspace*{0.3in} + \item Look at class attributes/methods + \end{itemize} +\end{frame} + + +\begin{frame}[fragile] + \frametitle{Class/instance attributes} + \begin{itemize} + \item So far: instance attributes + \end{itemize} +\begin{lstlisting} +class A: + x = 1 + +In []: a = A() +In []: a.x +Out[]: 1 + +In []: b = A() +In []: assert b.x == a.x +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Class/instance attributes} +\begin{lstlisting} +class A: + x = 1 + +In []: a, b = A(), A() + +In []: A.x = 2 +In []: b.x +Out[]: 2 +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Class/instance attributes: beware} +\begin{lstlisting} +class A: + x = 1 + +In []: a = A() +In []: a.x = 1 +In []: A.x = 2 +In []: a.x +Out[]: ?? +\end{lstlisting} +\end{frame} + +\begin{frame} + \frametitle{Understanding the scope} + \begin{itemize} + \item If \py{a.x} is not an instance attribute + \item Python looks in the class for the attribute! + \pause + \vspace*{0.25in} + \item So \py{a.x = 1} sets an instance attribute! + \end{itemize} +\end{frame} + +\begin{frame}[fragile,fragile] + \frametitle{Class attribute scope} +\begin{lstlisting} +class A: + x = 1 + def f(self): + return self.x + 1 + +In []: a = A() +In []: a.f() +\end{lstlisting} + \pause +\begin{lstlisting} +Out[]: 2 +\end{lstlisting} +\end{frame} + + +\begin{frame}[fragile] + \frametitle{Class methods} + \begin{itemize} + \item Can we have methods on the class? + \end{itemize} +\begin{lstlisting} +class A: + @classmethod + def method(cls, x): + print(cls, x) + +In []: A.method(1) +<class '__main__.A'> 1 +\end{lstlisting} +\end{frame} + +\begin{frame} + \frametitle{Class methods} + \begin{itemize} + \item \py{@classmethod} is a special decorator + \item Makes the method a class method + \item Implicit argument is the class (and not the instance) + \item Useful when you don't want to construct the object + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Summary} + \begin{itemize} + \item Class attributes + \item Class methods and the \py{@classmethod} decorator + \end{itemize} +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{frame}[plain, fragile] + \frametitle{Exercise: Point class attribute} + \begin{block}{} + Create a simple \py{Point} class with class attributes \py{x, y} that + default to 0.0. + \end{block} + +\begin{lstlisting} +In []: p = Point() +In []: p.x, p.y +Out[]: (0.0, 0.0) +\end{lstlisting} +\end{frame} + + +\begin{frame}[plain, fragile] + \frametitle{Solution} +\begin{lstlisting} +class Point: + x = 0.0 + y = 0.0 +\end{lstlisting} +\end{frame} + +\begin{frame}[plain, fragile] + \frametitle{Exercise: classmethod} + \begin{block}{} + Create a simple \py{Point} class with instance attributes \py{x, y} but + add a class method \py{polar(r, theta)} that takes coordinates in $(r, + \theta)$ form but returns a suitable point. Remember that, $x=r + \cos(\theta), y=r\sin(\theta)$. For example: + \end{block} + +\begin{lstlisting} +In []: p = Point.polar(1.0, 0.0) +In []: p.x, p.y +Out[]: (1.0, 0.0) +\end{lstlisting} + +\end{frame} + + +\begin{frame}[plain, fragile] + \frametitle{Solution} +\begin{lstlisting} +from math import sin, cos +class Point: + def __init__(self, x=0.0, y=0.0): + self.x = x + self.y = y + @classmethod + def polar(cls, r, theta): + x = r*cos(theta) + y = r*sin(theta) + return cls(x, y) + +\end{lstlisting} +\end{frame} + + + +\end{document} |