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

7_Class.ipynb 30 kB

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

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