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

7_Class.ipynb 30 kB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "# 1. 类"
  8. ]
  9. },
  10. {
  11. "cell_type": "markdown",
  12. "metadata": {},
  13. "source": [
  14. "Python中的变量、列表、字典等其实都是对象。不涉及面向对象编程的理论部分,在本教程中对概念进行解释。"
  15. ]
  16. },
  17. {
  18. "cell_type": "markdown",
  19. "metadata": {},
  20. "source": [
  21. "类声明如下"
  22. ]
  23. },
  24. {
  25. "cell_type": "markdown",
  26. "metadata": {},
  27. "source": [
  28. "```\n",
  29. "class class_name:\n",
  30. "\n",
  31. " Functions\n",
  32. "```"
  33. ]
  34. },
  35. {
  36. "cell_type": "code",
  37. "execution_count": 1,
  38. "metadata": {},
  39. "outputs": [],
  40. "source": [
  41. "# 一个最简单的类\n",
  42. "class FirstClass:\n",
  43. " pass\n"
  44. ]
  45. },
  46. {
  47. "cell_type": "markdown",
  48. "metadata": {},
  49. "source": [
  50. "**pass** 在python中意味着什么都不做。 "
  51. ]
  52. },
  53. {
  54. "cell_type": "markdown",
  55. "metadata": {},
  56. "source": [
  57. "上面声明了一个名为“FirstClass”的类对象,现在考虑一个具有“FirstClass”所有特征的“egclass”。所以你所要做的就是,将“egclass”等同于“FirstClass”。在python术语中,这称为创建实例。“egclass”是“FirstClass”的实例"
  58. ]
  59. },
  60. {
  61. "cell_type": "code",
  62. "execution_count": 2,
  63. "metadata": {},
  64. "outputs": [],
  65. "source": [
  66. "egclass = FirstClass()"
  67. ]
  68. },
  69. {
  70. "cell_type": "code",
  71. "execution_count": 3,
  72. "metadata": {},
  73. "outputs": [
  74. {
  75. "data": {
  76. "text/plain": [
  77. "__main__.FirstClass"
  78. ]
  79. },
  80. "execution_count": 3,
  81. "metadata": {},
  82. "output_type": "execute_result"
  83. }
  84. ],
  85. "source": [
  86. "type(egclass)"
  87. ]
  88. },
  89. {
  90. "cell_type": "code",
  91. "execution_count": 4,
  92. "metadata": {},
  93. "outputs": [
  94. {
  95. "data": {
  96. "text/plain": [
  97. "type"
  98. ]
  99. },
  100. "execution_count": 4,
  101. "metadata": {},
  102. "output_type": "execute_result"
  103. }
  104. ],
  105. "source": [
  106. "type(FirstClass)"
  107. ]
  108. },
  109. {
  110. "cell_type": "markdown",
  111. "metadata": {},
  112. "source": [
  113. "现在让我们向类中添加一些“功能”。这样我们的FirstClass就有了更好的定义。类内的函数被称为该类的“方法”"
  114. ]
  115. },
  116. {
  117. "cell_type": "markdown",
  118. "metadata": {},
  119. "source": [
  120. "大多数类都有一个名为`__init__`的函数。这些被称为魔术方法。在这个方法中,你基本上初始化了这个类的变量,或者任何适用于这个方法中指定的所有方法的初始化算法。类中的变量称为属性。"
  121. ]
  122. },
  123. {
  124. "cell_type": "markdown",
  125. "metadata": {},
  126. "source": [
  127. "这有助于简化实例的初始化过程。例如,\n",
  128. "\n",
  129. "在不使用魔法方法或被成为构造函数的`__init__`的情况下,我们必须定义一个**init()** 方法并调用**init()** 函数。"
  130. ]
  131. },
  132. {
  133. "cell_type": "code",
  134. "execution_count": 5,
  135. "metadata": {},
  136. "outputs": [
  137. {
  138. "ename": "AttributeError",
  139. "evalue": "'FirstClass' object has no attribute 'init'",
  140. "output_type": "error",
  141. "traceback": [
  142. "\u001b[0;31m-----------------------------------------------------------\u001b[0m",
  143. "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
  144. "\u001b[0;32m<ipython-input-5-d15e7b8e3d78>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0meg0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mFirstClass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0meg0\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
  145. "\u001b[0;31mAttributeError\u001b[0m: 'FirstClass' object has no attribute 'init'"
  146. ]
  147. }
  148. ],
  149. "source": [
  150. "eg0 = FirstClass()\n",
  151. "eg0.init()"
  152. ]
  153. },
  154. {
  155. "cell_type": "markdown",
  156. "metadata": {},
  157. "source": [
  158. "但是当构造函数被定义后,`__init__`被调用,这样初始化实例被创建。"
  159. ]
  160. },
  161. {
  162. "cell_type": "markdown",
  163. "metadata": {},
  164. "source": [
  165. "我们构造我们的`FirstClass`去接受两个变量名称和符号。\n",
  166. "\n",
  167. "我将会在稍后解释`self`。"
  168. ]
  169. },
  170. {
  171. "cell_type": "code",
  172. "execution_count": 11,
  173. "metadata": {},
  174. "outputs": [],
  175. "source": [
  176. "class FirstClass:\n",
  177. " \"\"\"My first class\"\"\"\n",
  178. " class_var = 10\n",
  179. " def __init__(self,name,symbol):\n",
  180. " self.name = name\n",
  181. " self.symbol = symbol"
  182. ]
  183. },
  184. {
  185. "cell_type": "markdown",
  186. "metadata": {},
  187. "source": [
  188. "现在我们已经定义了一个函数而且添加了`__init__`方法。我们可以创建一个名为FirstClass的实例,该实例现在接受两个参数。"
  189. ]
  190. },
  191. {
  192. "cell_type": "code",
  193. "execution_count": 12,
  194. "metadata": {},
  195. "outputs": [],
  196. "source": [
  197. "eg1 = FirstClass('one',1)\n",
  198. "eg2 = FirstClass('two',2)"
  199. ]
  200. },
  201. {
  202. "cell_type": "code",
  203. "execution_count": 13,
  204. "metadata": {},
  205. "outputs": [
  206. {
  207. "name": "stdout",
  208. "output_type": "stream",
  209. "text": [
  210. "one 1\n",
  211. "two 2\n",
  212. "My first class\n"
  213. ]
  214. }
  215. ],
  216. "source": [
  217. "print(eg1.name, eg1.symbol)\n",
  218. "print(eg2.name, eg2.symbol)\n",
  219. "print(eg1.__doc__)"
  220. ]
  221. },
  222. {
  223. "cell_type": "markdown",
  224. "metadata": {},
  225. "source": [
  226. "**dir( )** 函数在查看类包含什么以及它提供了什么方法时非常方便。"
  227. ]
  228. },
  229. {
  230. "cell_type": "code",
  231. "execution_count": 14,
  232. "metadata": {
  233. "scrolled": false
  234. },
  235. "outputs": [
  236. {
  237. "data": {
  238. "text/plain": [
  239. "['__class__',\n",
  240. " '__delattr__',\n",
  241. " '__dict__',\n",
  242. " '__dir__',\n",
  243. " '__doc__',\n",
  244. " '__eq__',\n",
  245. " '__format__',\n",
  246. " '__ge__',\n",
  247. " '__getattribute__',\n",
  248. " '__gt__',\n",
  249. " '__hash__',\n",
  250. " '__init__',\n",
  251. " '__init_subclass__',\n",
  252. " '__le__',\n",
  253. " '__lt__',\n",
  254. " '__module__',\n",
  255. " '__ne__',\n",
  256. " '__new__',\n",
  257. " '__reduce__',\n",
  258. " '__reduce_ex__',\n",
  259. " '__repr__',\n",
  260. " '__setattr__',\n",
  261. " '__sizeof__',\n",
  262. " '__str__',\n",
  263. " '__subclasshook__',\n",
  264. " '__weakref__',\n",
  265. " 'class_var']"
  266. ]
  267. },
  268. "execution_count": 14,
  269. "metadata": {},
  270. "output_type": "execute_result"
  271. }
  272. ],
  273. "source": [
  274. "dir(FirstClass)"
  275. ]
  276. },
  277. {
  278. "cell_type": "code",
  279. "execution_count": 10,
  280. "metadata": {},
  281. "outputs": [
  282. {
  283. "data": {
  284. "text/plain": [
  285. "'My first class'"
  286. ]
  287. },
  288. "execution_count": 10,
  289. "metadata": {},
  290. "output_type": "execute_result"
  291. }
  292. ],
  293. "source": [
  294. "FirstClass.__doc__"
  295. ]
  296. },
  297. {
  298. "cell_type": "markdown",
  299. "metadata": {},
  300. "source": [
  301. "实例的**dir()** 也显示了它定义的属性。"
  302. ]
  303. },
  304. {
  305. "cell_type": "code",
  306. "execution_count": 25,
  307. "metadata": {},
  308. "outputs": [
  309. {
  310. "data": {
  311. "text/plain": [
  312. "['__class__',\n",
  313. " '__delattr__',\n",
  314. " '__dict__',\n",
  315. " '__dir__',\n",
  316. " '__doc__',\n",
  317. " '__eq__',\n",
  318. " '__format__',\n",
  319. " '__ge__',\n",
  320. " '__getattribute__',\n",
  321. " '__gt__',\n",
  322. " '__hash__',\n",
  323. " '__init__',\n",
  324. " '__le__',\n",
  325. " '__lt__',\n",
  326. " '__module__',\n",
  327. " '__ne__',\n",
  328. " '__new__',\n",
  329. " '__reduce__',\n",
  330. " '__reduce_ex__',\n",
  331. " '__repr__',\n",
  332. " '__setattr__',\n",
  333. " '__sizeof__',\n",
  334. " '__str__',\n",
  335. " '__subclasshook__',\n",
  336. " '__weakref__',\n",
  337. " 'name',\n",
  338. " 'symbol']"
  339. ]
  340. },
  341. "execution_count": 25,
  342. "metadata": {},
  343. "output_type": "execute_result"
  344. }
  345. ],
  346. "source": [
  347. "dir(eg1)"
  348. ]
  349. },
  350. {
  351. "cell_type": "markdown",
  352. "metadata": {},
  353. "source": [
  354. "稍微改变一下FirstClass函数,"
  355. ]
  356. },
  357. {
  358. "cell_type": "code",
  359. "execution_count": 15,
  360. "metadata": {},
  361. "outputs": [],
  362. "source": [
  363. "class FirstClass:\n",
  364. " def __init__(self,name,symbol):\n",
  365. " self.n = name\n",
  366. " self.s = symbol"
  367. ]
  368. },
  369. {
  370. "cell_type": "markdown",
  371. "metadata": {},
  372. "source": [
  373. "将self.name和self.symbol转化成self.n和self.s会得到:"
  374. ]
  375. },
  376. {
  377. "cell_type": "code",
  378. "execution_count": 16,
  379. "metadata": {},
  380. "outputs": [],
  381. "source": [
  382. "eg1 = FirstClass('one',1)\n",
  383. "eg2 = FirstClass('two',2)"
  384. ]
  385. },
  386. {
  387. "cell_type": "code",
  388. "execution_count": 17,
  389. "metadata": {},
  390. "outputs": [
  391. {
  392. "ename": "AttributeError",
  393. "evalue": "'FirstClass' object has no attribute 'name'",
  394. "output_type": "error",
  395. "traceback": [
  396. "\u001b[0;31m-----------------------------------------------------------\u001b[0m",
  397. "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
  398. "\u001b[0;32m<ipython-input-17-4ab7dec1c737>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0meg1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0meg1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0meg2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0meg2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
  399. "\u001b[0;31mAttributeError\u001b[0m: 'FirstClass' object has no attribute 'name'"
  400. ]
  401. }
  402. ],
  403. "source": [
  404. "print(eg1.name, eg1.symbol)\n",
  405. "print(eg2.name, eg2.symbol)"
  406. ]
  407. },
  408. {
  409. "cell_type": "markdown",
  410. "metadata": {},
  411. "source": [
  412. "AttributeError, 还记得变量就是类中的属性吗?因此,这意味着我们没有为实例提供正确的属性。"
  413. ]
  414. },
  415. {
  416. "cell_type": "code",
  417. "execution_count": 18,
  418. "metadata": {},
  419. "outputs": [
  420. {
  421. "data": {
  422. "text/plain": [
  423. "['__class__',\n",
  424. " '__delattr__',\n",
  425. " '__dict__',\n",
  426. " '__dir__',\n",
  427. " '__doc__',\n",
  428. " '__eq__',\n",
  429. " '__format__',\n",
  430. " '__ge__',\n",
  431. " '__getattribute__',\n",
  432. " '__gt__',\n",
  433. " '__hash__',\n",
  434. " '__init__',\n",
  435. " '__init_subclass__',\n",
  436. " '__le__',\n",
  437. " '__lt__',\n",
  438. " '__module__',\n",
  439. " '__ne__',\n",
  440. " '__new__',\n",
  441. " '__reduce__',\n",
  442. " '__reduce_ex__',\n",
  443. " '__repr__',\n",
  444. " '__setattr__',\n",
  445. " '__sizeof__',\n",
  446. " '__str__',\n",
  447. " '__subclasshook__',\n",
  448. " '__weakref__',\n",
  449. " 'n',\n",
  450. " 's']"
  451. ]
  452. },
  453. "execution_count": 18,
  454. "metadata": {},
  455. "output_type": "execute_result"
  456. }
  457. ],
  458. "source": [
  459. "dir(eg1)"
  460. ]
  461. },
  462. {
  463. "cell_type": "code",
  464. "execution_count": 19,
  465. "metadata": {},
  466. "outputs": [
  467. {
  468. "name": "stdout",
  469. "output_type": "stream",
  470. "text": [
  471. "one 1\n",
  472. "two 2\n"
  473. ]
  474. }
  475. ],
  476. "source": [
  477. "print(eg1.n, eg1.s)\n",
  478. "print(eg2.n, eg2.s)"
  479. ]
  480. },
  481. {
  482. "cell_type": "markdown",
  483. "metadata": {},
  484. "source": [
  485. "现在我们解决了这个错误。现在让我们比较一下我们看到的两个例子。\n",
  486. "\n",
  487. "当我声明self.name和self.symbol时,使用eg1.name和eg1.symbol没有属性错误。当我声明self.n和self.s时,使用eg1.n和eg1.s没有属性错误。\n",
  488. "\n",
  489. "从以上我们可以得出self就是实例本身。\n",
  490. "\n",
  491. "记住,self不是预定义的,它是用户定义的。你可以利用任何你觉得舒服的东西。但是使用self已经成为一种常见的做法。"
  492. ]
  493. },
  494. {
  495. "cell_type": "code",
  496. "execution_count": 20,
  497. "metadata": {},
  498. "outputs": [],
  499. "source": [
  500. "class FirstClass:\n",
  501. " def __init__(asdf1234,name,symbol):\n",
  502. " asdf1234.n = name\n",
  503. " asdf1234.s = symbol"
  504. ]
  505. },
  506. {
  507. "cell_type": "code",
  508. "execution_count": 21,
  509. "metadata": {},
  510. "outputs": [],
  511. "source": [
  512. "eg1 = FirstClass('one',1)\n",
  513. "eg2 = FirstClass('two',2)"
  514. ]
  515. },
  516. {
  517. "cell_type": "code",
  518. "execution_count": 22,
  519. "metadata": {},
  520. "outputs": [
  521. {
  522. "name": "stdout",
  523. "output_type": "stream",
  524. "text": [
  525. "one 1\n",
  526. "two 2\n"
  527. ]
  528. }
  529. ],
  530. "source": [
  531. "print(eg1.n, eg1.s)\n",
  532. "print(eg2.n, eg2.s)"
  533. ]
  534. },
  535. {
  536. "cell_type": "markdown",
  537. "metadata": {},
  538. "source": [
  539. "因为eg1和eg2是FirstClass的实例,所以它不需要被限制在FirstClass本身。它可以通过声明其他属性来扩展自己,而不需要在FirstClass中声明属性。"
  540. ]
  541. },
  542. {
  543. "cell_type": "code",
  544. "execution_count": 23,
  545. "metadata": {},
  546. "outputs": [],
  547. "source": [
  548. "eg1.cube = 1\n",
  549. "eg2.cube = 8"
  550. ]
  551. },
  552. {
  553. "cell_type": "code",
  554. "execution_count": 24,
  555. "metadata": {},
  556. "outputs": [
  557. {
  558. "data": {
  559. "text/plain": [
  560. "['__class__',\n",
  561. " '__delattr__',\n",
  562. " '__dict__',\n",
  563. " '__dir__',\n",
  564. " '__doc__',\n",
  565. " '__eq__',\n",
  566. " '__format__',\n",
  567. " '__ge__',\n",
  568. " '__getattribute__',\n",
  569. " '__gt__',\n",
  570. " '__hash__',\n",
  571. " '__init__',\n",
  572. " '__init_subclass__',\n",
  573. " '__le__',\n",
  574. " '__lt__',\n",
  575. " '__module__',\n",
  576. " '__ne__',\n",
  577. " '__new__',\n",
  578. " '__reduce__',\n",
  579. " '__reduce_ex__',\n",
  580. " '__repr__',\n",
  581. " '__setattr__',\n",
  582. " '__sizeof__',\n",
  583. " '__str__',\n",
  584. " '__subclasshook__',\n",
  585. " '__weakref__',\n",
  586. " 'cube',\n",
  587. " 'n',\n",
  588. " 's']"
  589. ]
  590. },
  591. "execution_count": 24,
  592. "metadata": {},
  593. "output_type": "execute_result"
  594. }
  595. ],
  596. "source": [
  597. "dir(eg1)"
  598. ]
  599. },
  600. {
  601. "cell_type": "markdown",
  602. "metadata": {
  603. "collapsed": true
  604. },
  605. "source": [
  606. "就像我们前面看到的全局变量和局部变量一样,即使类也有自己的变量类型。\n",
  607. "\n",
  608. "**类属性**:在方法外部定义的属性,适用于所有实例。\n",
  609. "\n",
  610. "**实例属性**:在方法内部定义的属性,只适用于该方法,并且对每个实例都是唯一的。"
  611. ]
  612. },
  613. {
  614. "cell_type": "code",
  615. "execution_count": 25,
  616. "metadata": {},
  617. "outputs": [],
  618. "source": [
  619. "class FirstClass:\n",
  620. " test = 'test'\n",
  621. " def __init__(self,name,symbol):\n",
  622. " self.name = name\n",
  623. " self.symbol = symbol"
  624. ]
  625. },
  626. {
  627. "cell_type": "markdown",
  628. "metadata": {},
  629. "source": [
  630. "这里test是一个类属性,而name是一个实例属性。"
  631. ]
  632. },
  633. {
  634. "cell_type": "code",
  635. "execution_count": 26,
  636. "metadata": {},
  637. "outputs": [
  638. {
  639. "name": "stdout",
  640. "output_type": "stream",
  641. "text": [
  642. "test4\n"
  643. ]
  644. }
  645. ],
  646. "source": [
  647. "eg3 = FirstClass('Three',3)\n",
  648. "eg4 = FirstClass('Four', 4)\n",
  649. "eg4.test = 'test4'\n",
  650. "print(eg4.test)"
  651. ]
  652. },
  653. {
  654. "cell_type": "code",
  655. "execution_count": 27,
  656. "metadata": {},
  657. "outputs": [
  658. {
  659. "name": "stdout",
  660. "output_type": "stream",
  661. "text": [
  662. "test Three\n"
  663. ]
  664. }
  665. ],
  666. "source": [
  667. "print(eg3.test, eg3.name)"
  668. ]
  669. },
  670. {
  671. "cell_type": "markdown",
  672. "metadata": {},
  673. "source": [
  674. "让我们添加更多的方法到FirstClass。"
  675. ]
  676. },
  677. {
  678. "cell_type": "code",
  679. "execution_count": 30,
  680. "metadata": {},
  681. "outputs": [],
  682. "source": [
  683. "class FirstClass:\n",
  684. " def __init__(self,name,symbol):\n",
  685. " self.name = name\n",
  686. " self.symbol = symbol\n",
  687. " def square(self):\n",
  688. " return self.symbol * self.symbol\n",
  689. " def cube(self):\n",
  690. " return self.symbol * self.symbol * self.symbol\n",
  691. " def multiply(self, x):\n",
  692. " return self.symbol * x"
  693. ]
  694. },
  695. {
  696. "cell_type": "code",
  697. "execution_count": 31,
  698. "metadata": {},
  699. "outputs": [],
  700. "source": [
  701. "eg4 = FirstClass('Five',5)"
  702. ]
  703. },
  704. {
  705. "cell_type": "code",
  706. "execution_count": 32,
  707. "metadata": {},
  708. "outputs": [
  709. {
  710. "name": "stdout",
  711. "output_type": "stream",
  712. "text": [
  713. "25\n",
  714. "125\n"
  715. ]
  716. }
  717. ],
  718. "source": [
  719. "print(eg4.square())\n",
  720. "print(eg4.cube())"
  721. ]
  722. },
  723. {
  724. "cell_type": "code",
  725. "execution_count": 33,
  726. "metadata": {},
  727. "outputs": [
  728. {
  729. "data": {
  730. "text/plain": [
  731. "10"
  732. ]
  733. },
  734. "execution_count": 33,
  735. "metadata": {},
  736. "output_type": "execute_result"
  737. }
  738. ],
  739. "source": [
  740. "eg4.multiply(2)"
  741. ]
  742. },
  743. {
  744. "cell_type": "markdown",
  745. "metadata": {},
  746. "source": [
  747. "以上也可以写成:"
  748. ]
  749. },
  750. {
  751. "cell_type": "code",
  752. "execution_count": 34,
  753. "metadata": {},
  754. "outputs": [
  755. {
  756. "data": {
  757. "text/plain": [
  758. "10"
  759. ]
  760. },
  761. "execution_count": 34,
  762. "metadata": {},
  763. "output_type": "execute_result"
  764. }
  765. ],
  766. "source": [
  767. "FirstClass.multiply(eg4,2)"
  768. ]
  769. },
  770. {
  771. "cell_type": "markdown",
  772. "metadata": {},
  773. "source": [
  774. "## 2. 继承"
  775. ]
  776. },
  777. {
  778. "cell_type": "markdown",
  779. "metadata": {},
  780. "source": [
  781. "在某些情况下,新类需要具有已定义类的所有特征。因此,新类可以“继承”前一个类,并向其添加自己的方法,这称为继承。"
  782. ]
  783. },
  784. {
  785. "cell_type": "markdown",
  786. "metadata": {},
  787. "source": [
  788. "考虑类Person类具有薪水的方法。"
  789. ]
  790. },
  791. {
  792. "cell_type": "code",
  793. "execution_count": 35,
  794. "metadata": {},
  795. "outputs": [],
  796. "source": [
  797. "class Person:\n",
  798. " def __init__(self,name,age):\n",
  799. " self.name = name\n",
  800. " self.age = age\n",
  801. " def salary(self, value):\n",
  802. " self.money = value\n",
  803. " print(self.name,\"earns\",self.money)"
  804. ]
  805. },
  806. {
  807. "cell_type": "code",
  808. "execution_count": 36,
  809. "metadata": {},
  810. "outputs": [],
  811. "source": [
  812. "a = Person('Kartik',26)"
  813. ]
  814. },
  815. {
  816. "cell_type": "code",
  817. "execution_count": 37,
  818. "metadata": {},
  819. "outputs": [
  820. {
  821. "name": "stdout",
  822. "output_type": "stream",
  823. "text": [
  824. "Kartik earns 40000\n"
  825. ]
  826. }
  827. ],
  828. "source": [
  829. "a.salary(40000)"
  830. ]
  831. },
  832. {
  833. "cell_type": "code",
  834. "execution_count": 38,
  835. "metadata": {},
  836. "outputs": [
  837. {
  838. "data": {
  839. "text/plain": [
  840. "['__class__',\n",
  841. " '__delattr__',\n",
  842. " '__dict__',\n",
  843. " '__dir__',\n",
  844. " '__doc__',\n",
  845. " '__eq__',\n",
  846. " '__format__',\n",
  847. " '__ge__',\n",
  848. " '__getattribute__',\n",
  849. " '__gt__',\n",
  850. " '__hash__',\n",
  851. " '__init__',\n",
  852. " '__init_subclass__',\n",
  853. " '__le__',\n",
  854. " '__lt__',\n",
  855. " '__module__',\n",
  856. " '__ne__',\n",
  857. " '__new__',\n",
  858. " '__reduce__',\n",
  859. " '__reduce_ex__',\n",
  860. " '__repr__',\n",
  861. " '__setattr__',\n",
  862. " '__sizeof__',\n",
  863. " '__str__',\n",
  864. " '__subclasshook__',\n",
  865. " '__weakref__',\n",
  866. " 'salary']"
  867. ]
  868. },
  869. "execution_count": 38,
  870. "metadata": {},
  871. "output_type": "execute_result"
  872. }
  873. ],
  874. "source": [
  875. "dir(Person)"
  876. ]
  877. },
  878. {
  879. "cell_type": "markdown",
  880. "metadata": {},
  881. "source": [
  882. "现在考虑另一个Artist类,告诉我们艺术家挣的钱的数量和他的艺术形式。"
  883. ]
  884. },
  885. {
  886. "cell_type": "code",
  887. "execution_count": 39,
  888. "metadata": {},
  889. "outputs": [],
  890. "source": [
  891. "class Artist:\n",
  892. " def __init__(self,name,age):\n",
  893. " self.name = name\n",
  894. " self.age = age\n",
  895. " def salary(self,value):\n",
  896. " self.money = value\n",
  897. " print(self.name,\"earns\",self.money)\n",
  898. " def artform(self, job):\n",
  899. " self.job = job\n",
  900. " print(self.name,\"is a\", self.job)"
  901. ]
  902. },
  903. {
  904. "cell_type": "code",
  905. "execution_count": 40,
  906. "metadata": {},
  907. "outputs": [],
  908. "source": [
  909. "b = Artist('Nitin',20)"
  910. ]
  911. },
  912. {
  913. "cell_type": "code",
  914. "execution_count": 41,
  915. "metadata": {},
  916. "outputs": [
  917. {
  918. "name": "stdout",
  919. "output_type": "stream",
  920. "text": [
  921. "Nitin earns 50000\n",
  922. "Nitin is a Musician\n"
  923. ]
  924. }
  925. ],
  926. "source": [
  927. "b.salary(50000)\n",
  928. "b.artform('Musician')"
  929. ]
  930. },
  931. {
  932. "cell_type": "code",
  933. "execution_count": 42,
  934. "metadata": {},
  935. "outputs": [
  936. {
  937. "data": {
  938. "text/plain": [
  939. "['__class__',\n",
  940. " '__delattr__',\n",
  941. " '__dict__',\n",
  942. " '__dir__',\n",
  943. " '__doc__',\n",
  944. " '__eq__',\n",
  945. " '__format__',\n",
  946. " '__ge__',\n",
  947. " '__getattribute__',\n",
  948. " '__gt__',\n",
  949. " '__hash__',\n",
  950. " '__init__',\n",
  951. " '__init_subclass__',\n",
  952. " '__le__',\n",
  953. " '__lt__',\n",
  954. " '__module__',\n",
  955. " '__ne__',\n",
  956. " '__new__',\n",
  957. " '__reduce__',\n",
  958. " '__reduce_ex__',\n",
  959. " '__repr__',\n",
  960. " '__setattr__',\n",
  961. " '__sizeof__',\n",
  962. " '__str__',\n",
  963. " '__subclasshook__',\n",
  964. " '__weakref__',\n",
  965. " 'artform',\n",
  966. " 'salary']"
  967. ]
  968. },
  969. "execution_count": 42,
  970. "metadata": {},
  971. "output_type": "execute_result"
  972. }
  973. ],
  974. "source": [
  975. "dir(Artist)"
  976. ]
  977. },
  978. {
  979. "cell_type": "markdown",
  980. "metadata": {},
  981. "source": [
  982. "money 方法和salary 方法是一样的。因此,我们可以将该方法推广到工资类,并将软件工程师类继承到美术师类。现在艺术类变成了,"
  983. ]
  984. },
  985. {
  986. "cell_type": "code",
  987. "execution_count": 44,
  988. "metadata": {},
  989. "outputs": [],
  990. "source": [
  991. "class Artist(Person):\n",
  992. " def artform(self, job):\n",
  993. " self.job = job\n",
  994. " print(self.name,\"is a\", self.job)"
  995. ]
  996. },
  997. {
  998. "cell_type": "code",
  999. "execution_count": 45,
  1000. "metadata": {},
  1001. "outputs": [],
  1002. "source": [
  1003. "c = Artist('Nishanth',21)"
  1004. ]
  1005. },
  1006. {
  1007. "cell_type": "code",
  1008. "execution_count": 46,
  1009. "metadata": {},
  1010. "outputs": [
  1011. {
  1012. "data": {
  1013. "text/plain": [
  1014. "['__class__',\n",
  1015. " '__delattr__',\n",
  1016. " '__dict__',\n",
  1017. " '__dir__',\n",
  1018. " '__doc__',\n",
  1019. " '__eq__',\n",
  1020. " '__format__',\n",
  1021. " '__ge__',\n",
  1022. " '__getattribute__',\n",
  1023. " '__gt__',\n",
  1024. " '__hash__',\n",
  1025. " '__init__',\n",
  1026. " '__init_subclass__',\n",
  1027. " '__le__',\n",
  1028. " '__lt__',\n",
  1029. " '__module__',\n",
  1030. " '__ne__',\n",
  1031. " '__new__',\n",
  1032. " '__reduce__',\n",
  1033. " '__reduce_ex__',\n",
  1034. " '__repr__',\n",
  1035. " '__setattr__',\n",
  1036. " '__sizeof__',\n",
  1037. " '__str__',\n",
  1038. " '__subclasshook__',\n",
  1039. " '__weakref__',\n",
  1040. " 'artform',\n",
  1041. " 'salary']"
  1042. ]
  1043. },
  1044. "execution_count": 46,
  1045. "metadata": {},
  1046. "output_type": "execute_result"
  1047. }
  1048. ],
  1049. "source": [
  1050. "dir(Artist)"
  1051. ]
  1052. },
  1053. {
  1054. "cell_type": "code",
  1055. "execution_count": 47,
  1056. "metadata": {},
  1057. "outputs": [
  1058. {
  1059. "name": "stdout",
  1060. "output_type": "stream",
  1061. "text": [
  1062. "Nishanth earns 60000\n",
  1063. "Nishanth is a Dancer\n"
  1064. ]
  1065. }
  1066. ],
  1067. "source": [
  1068. "c.salary(60000)\n",
  1069. "c.artform('Dancer')"
  1070. ]
  1071. },
  1072. {
  1073. "cell_type": "markdown",
  1074. "metadata": {},
  1075. "source": [
  1076. "假设在继承一个特定方法的时候,该方法不适合新类。可以通过在新类中用相同的名称再次定义该方法来重写该方法。"
  1077. ]
  1078. },
  1079. {
  1080. "cell_type": "code",
  1081. "execution_count": 48,
  1082. "metadata": {},
  1083. "outputs": [],
  1084. "source": [
  1085. "class Artist(Person):\n",
  1086. " def artform(self, job):\n",
  1087. " self.job = job\n",
  1088. " print(self.name,\"is a\", self.job)\n",
  1089. " def salary(self, value):\n",
  1090. " self.money = value\n",
  1091. " print(self.name,\"earns\",self.money)\n",
  1092. " print(\"I am overriding the SoftwareEngineer class's salary method\")"
  1093. ]
  1094. },
  1095. {
  1096. "cell_type": "code",
  1097. "execution_count": 49,
  1098. "metadata": {},
  1099. "outputs": [],
  1100. "source": [
  1101. "c = Artist('Nishanth',21)"
  1102. ]
  1103. },
  1104. {
  1105. "cell_type": "code",
  1106. "execution_count": 50,
  1107. "metadata": {},
  1108. "outputs": [
  1109. {
  1110. "name": "stdout",
  1111. "output_type": "stream",
  1112. "text": [
  1113. "Nishanth earns 60000\n",
  1114. "I am overriding the SoftwareEngineer class's salary method\n",
  1115. "Nishanth is a Dancer\n"
  1116. ]
  1117. }
  1118. ],
  1119. "source": [
  1120. "c.salary(60000)\n",
  1121. "c.artform('Dancer')"
  1122. ]
  1123. },
  1124. {
  1125. "cell_type": "markdown",
  1126. "metadata": {},
  1127. "source": [
  1128. "如果不确定方法将被调用多少次,那么就很难声明那么多变量来携带每个结果,因此最好声明一个列表并附加结果。"
  1129. ]
  1130. },
  1131. {
  1132. "cell_type": "code",
  1133. "execution_count": 51,
  1134. "metadata": {},
  1135. "outputs": [],
  1136. "source": [
  1137. "class EmptyList:\n",
  1138. " def __init__(self):\n",
  1139. " self.data = []\n",
  1140. " def one(self,x):\n",
  1141. " self.data.append(x)\n",
  1142. " def two(self, x ):\n",
  1143. " self.data.append(x**2)\n",
  1144. " def three(self, x):\n",
  1145. " self.data.append(x**3)"
  1146. ]
  1147. },
  1148. {
  1149. "cell_type": "code",
  1150. "execution_count": 52,
  1151. "metadata": {},
  1152. "outputs": [],
  1153. "source": [
  1154. "xc = EmptyList()"
  1155. ]
  1156. },
  1157. {
  1158. "cell_type": "code",
  1159. "execution_count": 53,
  1160. "metadata": {},
  1161. "outputs": [
  1162. {
  1163. "name": "stdout",
  1164. "output_type": "stream",
  1165. "text": [
  1166. "[1]\n"
  1167. ]
  1168. }
  1169. ],
  1170. "source": [
  1171. "xc.one(1)\n",
  1172. "print(xc.data)"
  1173. ]
  1174. },
  1175. {
  1176. "cell_type": "markdown",
  1177. "metadata": {},
  1178. "source": [
  1179. "因为xc.data是一个列表,直接的列表操作也是可以进行的。"
  1180. ]
  1181. },
  1182. {
  1183. "cell_type": "code",
  1184. "execution_count": 60,
  1185. "metadata": {},
  1186. "outputs": [
  1187. {
  1188. "name": "stdout",
  1189. "output_type": "stream",
  1190. "text": [
  1191. "[1, 8]\n"
  1192. ]
  1193. }
  1194. ],
  1195. "source": [
  1196. "xc.data.append(8)\n",
  1197. "print(xc.data)"
  1198. ]
  1199. },
  1200. {
  1201. "cell_type": "code",
  1202. "execution_count": 61,
  1203. "metadata": {},
  1204. "outputs": [
  1205. {
  1206. "name": "stdout",
  1207. "output_type": "stream",
  1208. "text": [
  1209. "[1, 8, 9]\n"
  1210. ]
  1211. }
  1212. ],
  1213. "source": [
  1214. "xc.two(3)\n",
  1215. "print(xc.data)"
  1216. ]
  1217. },
  1218. {
  1219. "cell_type": "markdown",
  1220. "metadata": {},
  1221. "source": [
  1222. "如果输入参数的数量因实例而异,则可以使用星号。"
  1223. ]
  1224. },
  1225. {
  1226. "cell_type": "code",
  1227. "execution_count": 62,
  1228. "metadata": {},
  1229. "outputs": [],
  1230. "source": [
  1231. "class NotSure:\n",
  1232. " def __init__(self, *args):\n",
  1233. " self.data = ''.join(list(args)) "
  1234. ]
  1235. },
  1236. {
  1237. "cell_type": "code",
  1238. "execution_count": 63,
  1239. "metadata": {},
  1240. "outputs": [],
  1241. "source": [
  1242. "yz = NotSure('I', 'Do' , 'Not', 'Know', 'What', 'To','Type')"
  1243. ]
  1244. },
  1245. {
  1246. "cell_type": "code",
  1247. "execution_count": 64,
  1248. "metadata": {},
  1249. "outputs": [
  1250. {
  1251. "data": {
  1252. "text/plain": [
  1253. "'IDoNotKnowWhatToType'"
  1254. ]
  1255. },
  1256. "execution_count": 64,
  1257. "metadata": {},
  1258. "output_type": "execute_result"
  1259. }
  1260. ],
  1261. "source": [
  1262. "yz.data"
  1263. ]
  1264. },
  1265. {
  1266. "cell_type": "markdown",
  1267. "metadata": {},
  1268. "source": [
  1269. "# 3. 接下来应该怎么做"
  1270. ]
  1271. },
  1272. {
  1273. "cell_type": "markdown",
  1274. "metadata": {},
  1275. "source": [
  1276. "找各个方面的练习题,并独立完成能帮助你掌握Python的窍门,例如给自己一个问题并解决它们,你还可以在任何编程竞赛平台上提交问题求解。你编写的代码越多,你发现的越多,你就越开始欣赏这门语言。强烈建议把[Python作业](https://gitee.com/pi-lab/machinelearning_homework/blob/master/homework_01_python/README.md)完成,并在[其他编程练习](https://gitee.com/pi-lab/machinelearning_homework/blob/master/homework_01_python/README.md#references)里面找一些练习题或者项目做一下。\n",
  1277. "\n",
  1278. "现在已经向你介绍了Python,您可以尝试您感兴趣的领域中的不同Python库。我强烈建议您查看这个Python框架、库和软件列表 http://awesome-python.com\n",
  1279. "\n",
  1280. "\n",
  1281. "Pyton 教程:\n",
  1282. "* [Python tutorial (廖雪峰)](https://www.liaoxuefeng.com/wiki/1016959663602400)\n",
  1283. "* [Python基础教程](https://www.runoob.com/python/python-tutorial.html)\n",
  1284. "* [Python官方教程(中文版)](https://docs.python.org/zh-cn/3/tutorial/index.html)\n",
  1285. "* Python官方文档: https://docs.python.org/3/\n",
  1286. "* 本教程来源于:https://github.com/rajathkumarmp/Python-Lectures \n",
  1287. "\n",
  1288. "\n",
  1289. "**最后,享受解决问题的快乐!因为生命短暂,你需要Python!**"
  1290. ]
  1291. },
  1292. {
  1293. "cell_type": "code",
  1294. "execution_count": null,
  1295. "metadata": {},
  1296. "outputs": [],
  1297. "source": []
  1298. }
  1299. ],
  1300. "metadata": {
  1301. "kernelspec": {
  1302. "display_name": "Python 3",
  1303. "language": "python",
  1304. "name": "python3"
  1305. },
  1306. "language_info": {
  1307. "codemirror_mode": {
  1308. "name": "ipython",
  1309. "version": 3
  1310. },
  1311. "file_extension": ".py",
  1312. "mimetype": "text/x-python",
  1313. "name": "python",
  1314. "nbconvert_exporter": "python",
  1315. "pygments_lexer": "ipython3",
  1316. "version": "3.6.9"
  1317. }
  1318. },
  1319. "nbformat": 4,
  1320. "nbformat_minor": 1
  1321. }

机器学习越来越多应用到飞行器、机器人等领域,其目的是利用计算机实现类似人类的智能,从而实现装备的智能化与无人化。本课程旨在引导学生掌握机器学习的基本知识、典型方法与技术,通过具体的应用案例激发学生对该学科的兴趣,鼓励学生能够从人工智能的角度来分析、解决飞行器、机器人所面临的问题和挑战。本课程主要内容包括Python编程基础,机器学习模型,无监督学习、监督学习、深度学习基础知识与实现,并学习如何利用机器学习解决实际问题,从而全面提升自我的《综合能力》。