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

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

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