#!/usr/bin/env python # coding: utf-8 # # Konzept 7: Modularisierung # # Wächst ein Programm für ein größeres Projekt, # muss man trotzdem die Übersicht behalten können. # # Das Schlüsselkonzept vieler erfolgreichen Programmiersprachen ist "**Modularisierung**": # es handelt sich hierbei um abgekapselte Einheiten des Programms, # die jeweils in sich geschlossen sind und Teil eines größeren Programmes sein können. # Wir haben bereits "Klassen" kennengelernt, welche Funktionalitäten in handliche Bausteine abkapseln. # Objektorientierte Programmierung ist ein gutes Konzept, um die wachsende Komplexität in den Griff zu bekommen. Klassen bilden eine natürliche Einheit um Ordnung in das gesamte Progamm zu bringen. # # Dies scheitert jedoch, wenn immer mehr unterschiedliche Klassen, Funktionen und Strukturen ins Spiel kommen -- # dafür gibt es "*Module*". # # Die Verwendung von Modulen ist bereits an vielen Stellen vorgekommen: # es handelt sich um die `import`-Statements. # Diese laden ein Modul bzw. importieren bestimmte Symbole (welche Variablen, Funktionen oder Sub-Module sein können). # # Solch ein Modul kann im eigenen Programm liegen, oder global verfügbar sein. # *Beispiel:* Das `math` Modul wird importiert, # wobei dann die einzelnen Funktionen als Attribute zur Verfügung stehen: # In[1]: import math print(math.sqrt(4)) # *Beispiel*: Hier werden die Funktionen `sqrt` und `sin` aus dem Modul `math` importiert. # In[2]: from math import sqrt, sin print(sin(3.1415)) print(sqrt(2)) # Es können auch eigene Namen für die importierten Module oder Elemente vergeben werden. # Dadurch wird verhindert, dass es zu Namenskollisionen kommt! # # Beispiel: `sqrt` wird sowohl aus der `math` als auch der `sympy` Bibliothek importiert -- mit den Namen `csqrt` bzw. `symsqrt` -- und anschließend verwendet: # In[3]: from math import sqrt as csqrt from sympy import sqrt as symsqrt print(csqrt(5)) print(symsqrt(5).evalf(50)) # Genauso die [PyPlot API von Matplotlib](http://matplotlib.org/api/pyplot_api.html): # In[4]: get_ipython().run_line_magic('matplotlib', 'inline') import matplotlib.pyplot as plt # ## Eigene Module # # Eigene Module können auf (mindestens) zwei Arten erstellt werden: # # 1. Jede eigenständige `*.py` Datei ist ein Modul. # 1. Ein Verzeichnis mehrerer eigenständiger `*.py` Dateien mit einer darin enthaltenen `__init__.py` Datei. # Diese muss vorhanden sein, darf aber leer sein. # Wenn sie Code enthält, wird dieser beim Laden des Moduls ausgeführt. # # Module können an beliebiger Stelle im Dateisystem abgelegt werden. Sie müssen jedoch in der Liste der `sys.path` Pfade enthalten sein. Diese Liste wird beim Import des gewünschten Moduls durchsucht. # # [Module in Python 2](https://docs.python.org/2/tutorial/modules.html) # In[5]: import sys sys.path