diff --git a/labs04/Klasy.ipynb b/labs04/Klasy.ipynb new file mode 100644 index 0000000..5c34339 --- /dev/null +++ b/labs04/Klasy.ipynb @@ -0,0 +1,453 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Wprowadzenie do Pythona: część 2\n", + "\n", + "## Tomasz Dwojak\n", + "\n", + "## 2 grudnia 2017" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Plan na dziś:\n", + " * ciąg dalszy podstaw,\n", + " * klasy,\n", + " * moduły," + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Python jest językiem obiektowym \n", + " * Wszystko jest obiektem: liczby, napisy, None, funkcje, moduły (biblioteki)..." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "Python da się lubić !\n" + ] + } + ], + "source": [ + "print((2017).imag)\n", + "print(' '.join(['Python', 'da', 'się', 'lubić', '!']))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Konstrukcja" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "class NajprostszaKlasa:\n", + " pass\n", + "\n", + "nasza_klasa = NajprostszaKlasa() # Uwaga na nawiasy na końcu!\n", + "print(type(nasza_klasa))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## (Pseudo) Konstruktor \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "class Punkt:\n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y\n", + "\n", + "punkt = Punkt(2, 3)\n", + "print(punkt.x)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "class Figura:\n", + " def __init__(self, vertexes):\n", + " self.vertexes = vertexes\n", + " \n", + " def liczba_wierzcholkow(self):\n", + " return len(self.vertexes)\n", + " \n", + " def dodaj_wierzcholek(self, x):\n", + " self.vertexes.append(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "class Prostokat(Figura):\n", + " def __init__(self, vertexes):\n", + " super().__init__(vertexes)\n", + " \n", + " def czy_jestem_kwadratem(self):\n", + " pass\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class Figura:\n", + " def __init__(self, vertexes):\n", + " self.vertexes = vertexes\n", + " \n", + " def liczba_wierzcholkow(self):\n", + " return len(self.vertexes)\n", + " \n", + " def __len__(self):\n", + " return self.liczba_wierzcholkow()\n", + " \n", + "len(Figura([Punkt(2,3), Punkt(3,4), Punkt(0, 0)]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Dobre praktyki: komentarze" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class Punkt in module __main__:\n", + "\n", + "class Punkt(builtins.object)\n", + " | Klasa reprezentująca punkt w 2D.\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __init__(self, x, y)\n", + " | opis argumentów x i y.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data descriptors defined here:\n", + " | \n", + " | __dict__\n", + " | dictionary for instance variables (if defined)\n", + " | \n", + " | __weakref__\n", + " | list of weak references to the object (if defined)\n", + "\n" + ] + } + ], + "source": [ + "class Punkt(object):\n", + " \"\"\"Klasa reprezentująca punkt w 2D.\"\"\"\n", + " def __init__(self, x, y):\n", + " \"\"\"opis argumentów x i y.\"\"\"\n", + " self.x = x\n", + " self.y = y" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class Punkt in module __main__:\n", + "\n", + "class Punkt(builtins.object)\n", + " | Klasa reprezentująca punkt w 2D.\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __init__(self, x, y)\n", + " | opis argumentów x i y.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data descriptors defined here:\n", + " | \n", + " | __dict__\n", + " | dictionary for instance variables (if defined)\n", + " | \n", + " | __weakref__\n", + " | list of weak references to the object (if defined)\n", + "\n" + ] + } + ], + "source": [ + "help(Punkt)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Enkapsulacja: publiczne czy prywatne?\n", + " * Prywatne zaczynają się od dwóch podkreśleń: ``__``, np. ``def __policz(self)``\n", + " * chronione tylko w konwencji, zaczynają się od '\\_', np. ``def _parse(self)``\n", + " * publiczne jest wszystko co nie zaczyna się od '\\_'." + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'Parser' object has no attribute '__parse'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mParser\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mparser\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mparser\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__parse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'Parser' object has no attribute '__parse'" + ] + } + ], + "source": [ + "class Parser(object):\n", + " def __parse(self): pass\n", + " def _get(self): pass\n", + "parser = Parser()\n", + "parser._get()\n", + "parser.__parse()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Iteratory" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<__main__.Punkt object at 0x7feb78045908>\n", + "<__main__.Punkt object at 0x7feb78045828>\n", + "<__main__.Punkt object at 0x7feb780457f0>\n" + ] + } + ], + "source": [ + "class Figura:\n", + " def __init__(self, vertexes):\n", + " self.vertexes = vertexes \n", + " \n", + " def __iter__(self):\n", + " self.index = -1\n", + " return self\n", + " \n", + " def __next__(self):\n", + " self.index += 1\n", + " if self.index == len(self.vertexes):\n", + " raise StopIteration\n", + " return self.vertexes[self.index]\n", + " \n", + "for v in Figura([Punkt(2,3), Punkt(3,4), Punkt(0, 0)]):\n", + " print(v)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Co zostało pominięte?\n", + " * pola klas i metody statyczne,\n", + " * dekoratory,\n", + " * mutable i immutable \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "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.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}