|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "pycharm": {
- "name": "#%% md\n"
- },
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Software Entwicklung \n",
- "\n",
- "## Kapitel 8: Objektorientierung\n",
- "\n",
- "### 8.1 Objekte\n",
- "\n",
- "Bisher haben wir *Daten* und *Funktionen* getrennt betrachtet.\n",
- "Bei einem Objekt werden Daten (auch: *Attribute*) und Funktionen\n",
- "(auch: *Methoden*) an einer Stelle zusammengefasst.\n",
- "\n",
- "Die Methoden eines Objekts können - neben lokalen Variablen, globalen Variablen\n",
- "und Parametern - auch die Attribute des Objekts nutzen. So kann\n",
- "z.B. ein Datumsobjekt die Attribute \"Jahr\", \"Monat\" und \"Tag\" besitzen\n",
- "und die Methoden des Objekts auf Basis dieser Attribute den\n",
- "Wochentag (0: Montag, ..., 6: Sonntag) ausrechnen oder eine standardisierte\n",
- "Stringrepräsentation generieren.\n",
- "\n",
- "![Datum-Objekt](../img/object.png \"Datum-Objekt\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Datumsobjektsobjekte können mit Hilfe des Standardmoduls <code>datetime</code>\n",
- "generiert werden. Die Methoden eines Objekts werden stets mit der Dot-Notation\n",
- "aufgerufen."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "import datetime\n",
- "\n",
- "d = datetime.date(1989, 11, 9)\n",
- "print(d.weekday())\n",
- "print(d.isoformat())"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "### 8.2 Klassen\n",
- "\n",
- "Der Bauplan für Datumsobjekte, der die Attribute und Methoden festlegt,\n",
- "wird als *Klasse* bezeichnet. Das Standardmodul <code>datetime</code>\n",
- "enthält einen Bauplan für Datumsobjekte in Form der Klasse <code>date</code>.\n",
- "\n",
- "Objekte, die gemäß eines solchen\n",
- "Bauplans generiert wurden, haben die Klasse als Datentyp."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "print(type(d))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "### 8.3 Instanzen\n",
- "\n",
- "Der Bauplan, den eine Klasse bereitstellt, kann *mehrfach* benutzt werden, um\n",
- "mehrere Objekte zu erzeugen. Man spricht hier von *Instanzen* der Klasse."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "d1 = datetime.date(2000, 1, 1)\n",
- "d2 = datetime.date(2010, 1, 1)\n",
- "d3 = datetime.date(2020, 1, 1)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Die Attribute der Instanzen sind voneinander unabhängig, d.h.\n",
- "anders als globale Variablen mehrfach vorhanden. Die Methoden, die\n",
- "ja stets mit der Dot-Notation für eine spezifische Instanz aufgerufen\n",
- "werden, nutzen die Attribute ihrer jeweiligen Instanz und liefern daher\n",
- "ggf. unterschiedliche Werte."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "print(d1.weekday())\n",
- "print(d2.weekday())\n",
- "print(d3.weekday())"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "Welche Attribute und Methoden ein Objekt besitzt, ist normalerweise\n",
- "der Dokumentation oder dem Programmcode der Klasse zu entnehmen.\n",
- "Es gibt jedoch mit der Built-In-Funktion <code>dir</code> auch\n",
- "eine Möglichkeit, diese Information programmatisch zu ermitteln."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "print(dir(d1))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Beim betrachteten Datumsobjekt *beginnen und enden* einige der Methoden-\n",
- "und Attributsnamen mit einem doppelten Unterstich <code>\\_\\_</code>, im\n",
- "Python-Jargon auch *dunder methods* bzw. *dunder attributs* genannt.\n",
- "Diese Methoden und Attribute werden vom Python-System verwendet und\n",
- "dürfen nicht überschrieben werden! Ein bereits bekanntes Beispiel ist\n",
- "die Variable <code>\\_\\_name\\_\\_</code>, die den aktuellen Modulnamen \n",
- "oder den Wert <code>\\_\\_main\\_\\_</code> enthält."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "print(__name__)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "pycharm": {
- "name": "#%% md\n"
- }
- },
- "source": [
- "Auch die Definition eigener\n",
- "Funktionen und Variablen, die mit einem Doppel-Unterstich beginnen\n",
- "und enden, sollte vermieden werden. Es könnte andere Entwickler\n",
- "irritieren und System-Funktionen und -Variablen\n",
- "künftiger Python-Versionen verdecken."
- ]
- }
- ],
- "metadata": {
- "celltoolbar": "Slideshow",
- "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.9.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 1
- }
|