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

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