{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# The smell of classes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The \"data bundle\" smell"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-11T12:50:34.342224Z",
     "start_time": "2021-08-11T14:50:34.336560+02:00"
    }
   },
   "outputs": [],
   "source": [
    "def momentum(mass, velocity):\n",
    "    return mass * velocity\n",
    "\n",
    "def energy(mass, velocity):\n",
    "    return 0.5 * mass * velocity ** 2\n",
    "\n",
    "def update_position(velocity, position, dt):\n",
    "    return position + velocity * dt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-11T12:50:34.776689Z",
     "start_time": "2021-08-11T14:50:34.769617+02:00"
    }
   },
   "outputs": [],
   "source": [
    "# Naive\n",
    "mass1 = 10.0\n",
    "velocity1 = 0.9\n",
    "\n",
    "mass2 = 12.0\n",
    "velocity2 = 0.1\n",
    "\n",
    "print(momentum(mass1, velocity1))\n",
    "print(momentum(mass2, velocity2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We have two parameters that will be sent to these functions over and over again: `mass` and `velocity`.\n",
    "\n",
    "Moreover, the parameters cannot be mixed up (e.g. the velocity of one particle with the mass of another)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-07-27T15:05:52.548364Z",
     "start_time": "2018-07-27T17:05:52.544726+02:00"
    }
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introducing classes as a data bundle template"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-08-04T13:04:49.208543Z",
     "start_time": "2018-08-04T15:04:49.203180+02:00"
    }
   },
   "outputs": [],
   "source": [
    "class Particle:\n",
    "    pass\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Class methods"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-07-27T12:13:56.972938Z",
     "start_time": "2018-07-27T14:13:56.969323+02:00"
    }
   },
   "outputs": [],
   "source": [
    "def momentum(particle):\n",
    "    return particle.mass * particle.velocity\n",
    "\n",
    "print(momentum(particle1))\n",
    "print(momentum(particle2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "class Particle:\n",
    "    def __init__(self, mass, velocity):\n",
    "        self.mass = mass\n",
    "        self.velocity = velocity\n",
    "\n",
    "    # Method here\n",
    "\n",
    "particle1 = Particle(10.0, 0.9, 0.0)\n",
    "print(particle1.momentum())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "We have been using class instances and methods all along..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "s = 'A scanner Darkly'\n",
    "s.capitalize()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "x = set(['apple', 'banana', 'apple', 'pineapple'])\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "x.union(['banana', 'kiwi'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "\n"
   ]
  }
 ],
 "metadata": {
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.3"
  },
  "toc": {
   "nav_menu": {
    "height": "174px",
    "width": "252px"
   },
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 4,
   "toc_cell": false,
   "toc_position": {
    "height": "953px",
    "left": "0px",
    "right": "1253px",
    "top": "127px",
    "width": "320px"
   },
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
