Advertisement
Guest User

Untitled

a guest
May 21st, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.17 KB | None | 0 0
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "# Python Fundamentals - част V"
  8. ]
  9. },
  10. {
  11. "cell_type": "markdown",
  12. "metadata": {},
  13. "source": [
  14. "## ООП"
  15. ]
  16. },
  17. {
  18. "cell_type": "markdown",
  19. "metadata": {},
  20. "source": [
  21. "Обектно-ориентираното програмиране (ООП) е парадигма в компютърното програмиране, при която една програмна съдържа набор от обекти, които взаимодействат помежду си. Другият вариант е програмата да съдържа последователни инструкции, които биват изпълнявани. Всеки обект е може да изпълнява действия,да обработва изпраща и приема данни.\n",
  22. "\n",
  23. "ООП дава повече гъвкавост, като прави по-лесно и безопасно манипулирането на програми. В наши дни повечето от използваните езици за програмиране са ООП езици."
  24. ]
  25. },
  26. {
  27. "cell_type": "markdown",
  28. "metadata": {},
  29. "source": [
  30. "### Обектно-ориентираното програмиране дефинира следните концепции:"
  31. ]
  32. },
  33. {
  34. "cell_type": "markdown",
  35. "metadata": {},
  36. "source": [
  37. "Обекти – съдържат данни (полета) и функционалност - променливи и функции(моетоди). Обектите са инстанции на класовете. Обектите са самостоятелни обособени единици. Класовете спомагат за модуляризираността, което позволява на части от програмата да съответстват на отделни аспекти от ершаването на дадена задача или проблем."
  38. ]
  39. },
  40. {
  41. "cell_type": "markdown",
  42. "metadata": {},
  43. "source": [
  44. "Абстракция – Свойството на една програма да игнорира дадени аспекти на информацията, с която работи, като се съредоточава върху същественото."
  45. ]
  46. },
  47. {
  48. "cell_type": "markdown",
  49. "metadata": {},
  50. "source": [
  51. "Капсулиране – наричано също „скриване на информация“. Предотвратява директния достъп до данните на даден обект."
  52. ]
  53. },
  54. {
  55. "cell_type": "markdown",
  56. "metadata": {},
  57. "source": [
  58. "Полиморфизъм – свойството на обектите да се държат по различен начин, зависимо от заобикалящата среда. На програмен език това значи - една и съща по име функция(метод) да има различна сигнатра(дефиниция). По този начин, една променлива в програмния текст може да съдържа различни обекти по време на изпълнение на програмата и да извиква различни методи по различно време на изпълнение."
  59. ]
  60. },
  61. {
  62. "cell_type": "markdown",
  63. "metadata": {},
  64. "source": [
  65. "Наследяване – Организира и подпомага полиморфизма и капсулирането, като позволява да бъдат дефинирани и създавани обекти (наследници), които са наследени варианти на вече съществуващи обекти. Новите обекти могат да използват (и разширяват) съществуващата вече функционалсност дефинирана в базовия клас вече дефинираното поведение."
  66. ]
  67. },
  68. {
  69. "cell_type": "markdown",
  70. "metadata": {},
  71. "source": [
  72. "### Класове в Python"
  73. ]
  74. },
  75. {
  76. "cell_type": "markdown",
  77. "metadata": {},
  78. "source": [
  79. "Класът е дефиниция за създаване обекти (инстанции на класа). Това става със запазената дума class"
  80. ]
  81. },
  82. {
  83. "cell_type": "code",
  84. "execution_count": 1,
  85. "metadata": {},
  86. "outputs": [],
  87. "source": [
  88. "class A():\n",
  89. " pass"
  90. ]
  91. },
  92. {
  93. "cell_type": "markdown",
  94. "metadata": {},
  95. "source": [
  96. "self е задължителен аргумент на методите на класа. self винаги е първият аргумент на даден метод и представлява референция към текущия обект, подобно на this в множество други езици"
  97. ]
  98. },
  99. {
  100. "cell_type": "code",
  101. "execution_count": 2,
  102. "metadata": {},
  103. "outputs": [
  104. {
  105. "name": "stdout",
  106. "output_type": "stream",
  107. "text": [
  108. "This is a print call from inside a class method\n"
  109. ]
  110. }
  111. ],
  112. "source": [
  113. "class A():\n",
  114. " def func(self):\n",
  115. " print('This is a print call from inside a class method')\n",
  116. " \n",
  117. "obj = A()\n",
  118. "obj.func()"
  119. ]
  120. },
  121. {
  122. "cell_type": "markdown",
  123. "metadata": {},
  124. "source": [
  125. "__init__ метода е мястото където е редно да се дефинират и инициализират обектните променливи. __init__ е подобен на конструпторите в много от другите познати ООП езици, като и тук той винаги има за първи аргумент self"
  126. ]
  127. },
  128. {
  129. "cell_type": "code",
  130. "execution_count": 3,
  131. "metadata": {},
  132. "outputs": [
  133. {
  134. "name": "stdout",
  135. "output_type": "stream",
  136. "text": [
  137. "I am object variable\n"
  138. ]
  139. }
  140. ],
  141. "source": [
  142. "class A():\n",
  143. " def __init__(self, var):\n",
  144. " self.var = var\n",
  145. " \n",
  146. "obj = A('I am object variable')\n",
  147. "print(obj.var)"
  148. ]
  149. },
  150. {
  151. "cell_type": "markdown",
  152. "metadata": {
  153. "scrolled": true
  154. },
  155. "source": [
  156. "Наследяване в Python се реалириза когато в скобите на класа наследник укажем кой базов клас се наследвя "
  157. ]
  158. },
  159. {
  160. "cell_type": "code",
  161. "execution_count": 4,
  162. "metadata": {},
  163. "outputs": [],
  164. "source": [
  165. "class Parent():\n",
  166. " pass\n",
  167. "class Child(Parent):\n",
  168. " pass"
  169. ]
  170. },
  171. {
  172. "cell_type": "markdown",
  173. "metadata": {
  174. "scrolled": true
  175. },
  176. "source": [
  177. "__init__ метода на базовия клас не се извиква автоматично от __init__ метода на класа наследник"
  178. ]
  179. },
  180. {
  181. "cell_type": "code",
  182. "execution_count": 5,
  183. "metadata": {},
  184. "outputs": [
  185. {
  186. "name": "stdout",
  187. "output_type": "stream",
  188. "text": [
  189. "Creation of instance of Class Child\n"
  190. ]
  191. }
  192. ],
  193. "source": [
  194. "class Parent():\n",
  195. " def __init__(self):\n",
  196. " print('Creation of instance of Class Parent')\n",
  197. "class Child(Parent):\n",
  198. " def __init__(self):\n",
  199. " print('Creation of instance of Class Child')\n",
  200. "obj = Child()"
  201. ]
  202. },
  203. {
  204. "cell_type": "markdown",
  205. "metadata": {
  206. "scrolled": true
  207. },
  208. "source": [
  209. "Горепосоченото може да бъде постигнато чрез използването на функцията super() която предоставя достъп до базовия клас от наследяващия го"
  210. ]
  211. },
  212. {
  213. "cell_type": "code",
  214. "execution_count": 6,
  215. "metadata": {},
  216. "outputs": [
  217. {
  218. "name": "stdout",
  219. "output_type": "stream",
  220. "text": [
  221. "Creation of instance of Class Parent\n",
  222. "Creation of instance of Class Child\n"
  223. ]
  224. }
  225. ],
  226. "source": [
  227. "class Parent():\n",
  228. " def __init__(self):\n",
  229. " print('Creation of instance of Class Parent')\n",
  230. "class Child(Parent):\n",
  231. " def __init__(self):\n",
  232. " super().__init__()\n",
  233. " print('Creation of instance of Class Child')\n",
  234. "obj = Child()"
  235. ]
  236. },
  237. {
  238. "cell_type": "markdown",
  239. "metadata": {},
  240. "source": [
  241. "С помощта на функцията super() може да достъпваме както методи така и данни дефинирани в базовия клас. За целта преди това трябва данни на базовия клас да са достъпни в класа наследник, което се постига чрез извикване на __init__ метода на басозвия клас от __init__ метода на класа наследник."
  242. ]
  243. },
  244. {
  245. "cell_type": "code",
  246. "execution_count": 7,
  247. "metadata": {},
  248. "outputs": [
  249. {
  250. "name": "stdout",
  251. "output_type": "stream",
  252. "text": [
  253. "Printing var from the base class. var=VARIABLE-FORM-BASE-CLASS\n"
  254. ]
  255. }
  256. ],
  257. "source": [
  258. "class B(A):\n",
  259. " def __init__(self):\n",
  260. " super().__init__('VARIABLE-FORM-BASE-CLASS')\n",
  261. " def func(self):\n",
  262. " print('Printing var from the base class. var={}'.format(self.var))\n",
  263. "objB = B()\n",
  264. "objB.func()"
  265. ]
  266. },
  267. {
  268. "cell_type": "markdown",
  269. "metadata": {},
  270. "source": [
  271. "### Специални функции в класове"
  272. ]
  273. },
  274. {
  275. "cell_type": "markdown",
  276. "metadata": {
  277. "scrolled": true
  278. },
  279. "source": [
  280. "Подобно на предефениране на функции и/или оператори в други езици за програрамиране в Python има специални функции които имат формата __име-на-функция__.Ето някой често използвани са:\n",
  281. "__str__\n",
  282. "__repr__\n",
  283. "__eq__\n",
  284. "__int__\n",
  285. "__bool__\n",
  286. "__abd__\n"
  287. ]
  288. },
  289. {
  290. "cell_type": "code",
  291. "execution_count": 8,
  292. "metadata": {},
  293. "outputs": [
  294. {
  295. "name": "stdout",
  296. "output_type": "stream",
  297. "text": [
  298. "Dacia with 90 hp engine\n",
  299. "BMW with 200 hp engine is equal to Audi with 200 hp engine\n"
  300. ]
  301. },
  302. {
  303. "data": {
  304. "text/plain": [
  305. "This is a object of class car() with:\n",
  306. " name object variable = Dacia and power object variable = 90\n",
  307. " This information is only useful for developers and not the user!"
  308. ]
  309. },
  310. "execution_count": 8,
  311. "metadata": {},
  312. "output_type": "execute_result"
  313. }
  314. ],
  315. "source": [
  316. "class car():\n",
  317. " def __init__(self, make, power):\n",
  318. " self.make = make\n",
  319. " self.power = power\n",
  320. " def __str__(self):\n",
  321. " return '{} with {} hp engine'.format(self.make, self.power)\n",
  322. " def __repr__(self):\n",
  323. " return '''This is a object of class {}() with:\n",
  324. " name object variable = {} and power object variable = {}\n",
  325. " This information is only useful for developers and not the user!'''.format(type(self).__name__, self.make, str(self.power))\n",
  326. " def __eq__(self, other):\n",
  327. " return self.power == other.power\n",
  328. "\n",
  329. "car1 = car('BMW', 200)\n",
  330. "car2 = car('Audi', 200)\n",
  331. "car3 = car('Dacia', 90)\n",
  332. "print(car3)\n",
  333. "if car1 == car2:\n",
  334. " print(str(car1) + ' is equal to ' + str(car2))\n",
  335. "car1"
  336. ]
  337. }
  338. ],
  339. "metadata": {
  340. "kernelspec": {
  341. "display_name": "Python 3",
  342. "language": "python",
  343. "name": "python3"
  344. },
  345. "language_info": {
  346. "codemirror_mode": {
  347. "name": "ipython",
  348. "version": 3
  349. },
  350. "file_extension": ".py",
  351. "mimetype": "text/x-python",
  352. "name": "python",
  353. "nbconvert_exporter": "python",
  354. "pygments_lexer": "ipython3",
  355. "version": "3.7.3"
  356. }
  357. },
  358. "nbformat": 4,
  359. "nbformat_minor": 2
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement