{
"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 datetime
\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 datetime
\n",
"enthält einen Bauplan für Datumsobjekte in Form der Klasse date
.\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 dir
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 \\_\\_
, 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 \\_\\_name\\_\\_
, die den aktuellen Modulnamen \n",
"oder den Wert \\_\\_main\\_\\_
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
}