You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

083 Vererbung.ipynb 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {
  6. "slideshow": {
  7. "slide_type": "slide"
  8. }
  9. },
  10. "source": [
  11. "# Software Entwicklung \n",
  12. "\n",
  13. "## Kapitel 8: Objektorientierung\n",
  14. "\n",
  15. "### 8.8 Vererbung\n",
  16. "\n",
  17. "Neue Klassen können auch bestehende Klassen erweitern.\n",
  18. "Die neue Klasse wird von einer oder mehreren *Oberklassen*\n",
  19. "abgeleitet und ist in dieser Beziehnung die *Unterklasse*.\n",
  20. "Die Oberklassen werden bei der Klassendefinition\n",
  21. "zwischen den Klammern angegeben.\n",
  22. "\n",
  23. "<code> class Unterklasse(Oberklasse1, Oberklasse2, ...): </code>"
  24. ]
  25. },
  26. {
  27. "cell_type": "markdown",
  28. "metadata": {
  29. "slideshow": {
  30. "slide_type": "slide"
  31. }
  32. },
  33. "source": [
  34. "Die *Unterklasse* erbt alle Attribute und Methoden\n",
  35. "der *Oberklassen*."
  36. ]
  37. },
  38. {
  39. "cell_type": "code",
  40. "execution_count": null,
  41. "metadata": {
  42. "pycharm": {
  43. "name": "#%%\n"
  44. }
  45. },
  46. "outputs": [],
  47. "source": [
  48. "class Student():\n",
  49. "\n",
  50. " def __init__(self, name):\n",
  51. " self.__name = name\n",
  52. "\n",
  53. " def __str__(self):\n",
  54. " return self.__name\n",
  55. "\n",
  56. "\n",
  57. "class BMEDStudent(Student):\n",
  58. "\n",
  59. " def get_major_subject(self):\n",
  60. " return None\n",
  61. "\n",
  62. "\n",
  63. "s = BMEDStudent(\"Herbert\")\n",
  64. "print(str(s))\n",
  65. "print(s.get_major_subject())"
  66. ]
  67. },
  68. {
  69. "cell_type": "markdown",
  70. "metadata": {
  71. "slideshow": {
  72. "slide_type": "slide"
  73. }
  74. },
  75. "source": [
  76. "In einer Unterklasse können neue Methoden und\n",
  77. "Attribute ergänzt sowie geerbte Methoden überschrieben werden."
  78. ]
  79. },
  80. {
  81. "cell_type": "code",
  82. "execution_count": null,
  83. "metadata": {
  84. "pycharm": {
  85. "name": "#%%\n"
  86. }
  87. },
  88. "outputs": [],
  89. "source": [
  90. "class BMMFStudent(BMEDStudent):\n",
  91. "\n",
  92. " def get_favorite_lecture(self):\n",
  93. " return \"Software Entwicklung\"\n",
  94. "\n",
  95. " def get_major_subject(self):\n",
  96. " return \"MF\"\n",
  97. "\n",
  98. "s = BMMFStudent(\"Helga\")\n",
  99. "print(str(s))\n",
  100. "print(s.get_major_subject())"
  101. ]
  102. },
  103. {
  104. "cell_type": "markdown",
  105. "metadata": {
  106. "slideshow": {
  107. "slide_type": "slide"
  108. }
  109. },
  110. "source": [
  111. "Gelegentlich benötigt man in einer Unterklasse Zugriff auf Methoden der Oberklassen\n",
  112. "in dem Zustand, *bevor* sie überschrieben wurden. Dies kann mit der\n",
  113. "Built-In Funktion *super* erreicht werden, die das aktuelle Objekt im Gewand der\n",
  114. "Oberklasse zurückgibt, so dass die Methoden der Oberklasse aufgerufen werden können."
  115. ]
  116. },
  117. {
  118. "cell_type": "code",
  119. "execution_count": null,
  120. "metadata": {
  121. "pycharm": {
  122. "name": "#%%\n"
  123. }
  124. },
  125. "outputs": [],
  126. "source": [
  127. "class BMEIStudent(BMEDStudent):\n",
  128. "\n",
  129. " def get_major_subject(self):\n",
  130. " return \"EI\"\n",
  131. "\n",
  132. " def __str__(self):\n",
  133. " return super().__str__() + \" \" + self.get_major_subject()\n",
  134. "\n",
  135. "s = BMEIStudent(\"Henning\")\n",
  136. "print(str(s))\n"
  137. ]
  138. },
  139. {
  140. "cell_type": "markdown",
  141. "metadata": {
  142. "pycharm": {
  143. "name": "#%% md\n"
  144. },
  145. "slideshow": {
  146. "slide_type": "slide"
  147. }
  148. },
  149. "source": [
  150. "### 8.9 Polymorphie\n",
  151. "\n",
  152. "Der Begriff *Polymorphie* stammt aus dem Griechischen und setzt sich zusammen aus\n",
  153. "\n",
  154. "* πολύς (polýs) = \"viel\"\n",
  155. "* μορφή (morphé) = \"Gestalt\"\n",
  156. "\n",
  157. "Beschrieben wird damit der Umstand, dass der Aufrufer einer Methode nicht genau wissen muss,\n",
  158. "welches Objekt er vor sich hat, und dennoch die richtige Methode ausgeführt wird."
  159. ]
  160. },
  161. {
  162. "cell_type": "code",
  163. "execution_count": null,
  164. "metadata": {
  165. "pycharm": {
  166. "name": "#%%\n"
  167. }
  168. },
  169. "outputs": [],
  170. "source": [
  171. "from random import random\n",
  172. "\n",
  173. "if random() < 0.5:\n",
  174. " s = BMMFStudent(\"Hans\")\n",
  175. "else:\n",
  176. " s = BMEIStudent(\"Hannelore\")\n",
  177. "\n",
  178. "print(s.get_major_subject())"
  179. ]
  180. },
  181. {
  182. "cell_type": "markdown",
  183. "metadata": {
  184. "pycharm": {
  185. "name": "#%% md\n"
  186. }
  187. },
  188. "source": [
  189. "Die Methode <code>get_major_subject</code> ist im obigen Beispiel *polymorph*.\n",
  190. "\n",
  191. "\n"
  192. ]
  193. }
  194. ],
  195. "metadata": {
  196. "celltoolbar": "Slideshow",
  197. "kernelspec": {
  198. "display_name": "Python 3 (ipykernel)",
  199. "language": "python",
  200. "name": "python3"
  201. },
  202. "language_info": {
  203. "codemirror_mode": {
  204. "name": "ipython",
  205. "version": 3
  206. },
  207. "file_extension": ".py",
  208. "mimetype": "text/x-python",
  209. "name": "python",
  210. "nbconvert_exporter": "python",
  211. "pygments_lexer": "ipython3",
  212. "version": "3.9.9"
  213. }
  214. },
  215. "nbformat": 4,
  216. "nbformat_minor": 1
  217. }