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 28 kB

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

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