{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# [Classes](https://docs.python.org/3/tutorial/classes.html#a-first-look-at-classes)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class MyFirstClass:\n", " def __init__(self, name):\n", " self.name = name\n", "\n", " def greet(self):\n", " print('Hello {}!'.format(self.name))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "my_instance = MyFirstClass('John Doe')\n", "print('my_intance: {}'.format(my_instance))\n", "print('type: {}'.format(type(my_instance)))\n", "print('my_instance.name: {}'.format(my_instance.name))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Methods\n", "The functions inside classes are called methods. They are used similarly as functions. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "alice = MyFirstClass(name='Alice')\n", "alice.greet()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `__init__()`\n", "`__init__()` is a special method that is used for initialising instances of the class. It's called when you create an instance of the class. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Example:\n", " def __init__(self):\n", " print('Now we are inside __init__')\n", " \n", "print('creating instance of Example')\n", "example = Example()\n", "print('instance created')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`__init__()` is typically used for initialising instance variables of your class. These can be listed as arguments after `self`. To be able to access these instance variables later during your instance's lifetime, you have to save them into `self`. `self` is the first argument of the methods of your class and it's your access to the instance variables and other methods. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Example:\n", " def __init__(self, var1, var2):\n", " self.first_var = var1\n", " self.second_var = var2\n", " \n", " def print_variables(self):\n", " print('{} {}'.format(self.first_var, self.second_var))\n", " \n", "e = Example('abc', 123)\n", "e.print_variables()\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Class variables vs instance variables\n", "Class variables are shared between all the instances of that class whereas instance variables can hold different values between different instances of that class." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Example:\n", " # These are class variables\n", " name = 'Example class'\n", " description = 'Just an example of a simple class'\n", "\n", " def __init__(self, var1):\n", " # This is an instance variable\n", " self.instance_variable = var1\n", "\n", " def show_info(self):\n", " info = 'instance_variable: {}, name: {}, description: {}'.format(\n", " self.instance_variable, Example.name, Example.description)\n", " print(info)\n", "\n", "\n", "inst1 = Example('foo')\n", "inst2 = Example('bar')\n", "\n", "# name and description have identical values between instances\n", "assert inst1.name == inst2.name == Example.name\n", "assert inst1.description == inst2.description == Example.description\n", "\n", "# If you change the value of a class variable, it's changed across all instances\n", "Example.name = 'Modified name'\n", "inst1.show_info()\n", "inst2.show_info()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.5.4" } }, "nbformat": 4, "nbformat_minor": 2 }