鍍金池/ 教程/ Python/ exercise41.學(xué)會(huì)說面向?qū)ο?/span>
附錄 A-練習(xí) 9:生成一個(gè)空文件(Touch, New-Item)
附錄 A-練習(xí) 10:復(fù)制文件 (cp)
exercise44.繼承 Vs.包含
附錄 A-練習(xí) 14:刪除文件 (rm)
附錄 A-練習(xí) 11:移動(dòng)文件 (mv)
exercise46.項(xiàng)目骨架
附錄 A-練習(xí) 3:如果你迷路了
exercise37.復(fù)習(xí)符號(hào)
exercise47.自動(dòng)化測(cè)試
exercise3.數(shù)字和數(shù)學(xué)計(jì)算
附錄 A-練習(xí) 1:安裝
exercise32.循環(huán)和列表
exercise31.做出決定
exercise42.對(duì)象、類、以及從屬關(guān)系
exercise48.更復(fù)雜的用戶輸入
下一步
簡(jiǎn)介
附錄 A-練習(xí) 7:刪除路徑 (rmdir)
exercise49.寫代碼語句
exercise18.命名, 變量, 代碼, 函數(shù)
exercise12.提示別人
exercise14.提示和傳遞
exercise40.模塊, 類和對(duì)象
附錄 A-練習(xí) 12:查看文件 (less, MORE)
exercise9.打印, 打印, 打印
exercise13.參數(shù), 解包, 變量
exercise30. Else 和 If
exercise28. 布爾表達(dá)式
附錄 A-練習(xí) 4:創(chuàng)建一個(gè)路徑 (mkdir)
附錄 A-練習(xí) 15:退出命令行 (exit)
exercise25. 更多更多的練習(xí)
exercise6.字符串和文本
exercise2.注釋和井號(hào)“#”
exercise21. 函數(shù)的返回值
附錄 A-下一步
exercise1.第一個(gè)程序
exercise23. 閱讀代碼
附錄 A-練習(xí) 5:改變當(dāng)前路徑 (cd)
exercise17.更多文件操作
exercise24. 更多的練習(xí)
exercise19.函數(shù)和變量
exercise51.從瀏覽器獲取輸入
exercise22. 到目前為止你學(xué)到了什么?
exercise41.學(xué)會(huì)說面向?qū)ο?/span>
exercise52.開始你的 web 游戲
exercise20. 函數(shù)和文件
exercise15.讀文件
exercise45.你來制作一個(gè)游戲
exercise10.那是什么?
exercise8.打印, 打印
exercise35.分支和函數(shù)
exercise26. 恭喜你,可以進(jìn)行一次考試了
exercise33.while 循環(huán)
exercise29. IF 語句
exercise36.設(shè)計(jì)和調(diào)試
exercise0.安裝和準(zhǔn)備
exercise50.你的第一個(gè)網(wǎng)站
附錄 A-練習(xí) 2:路徑, 文件夾, 名錄 (pwd)
exercise38.列表操作
附錄 A-練習(xí) 6:列出當(dāng)前路徑 (ls)
exercise16.讀寫文件
exercise4.變量和命名
exercise34.訪問列表元素
exercise11.提問
exercise43.基本的面向?qū)ο蟮姆治龊驮O(shè)計(jì)
附錄 A-簡(jiǎn)介
附錄 A-練習(xí) 8:目錄切換(pushd, popd)
來自老程序員的建議
exercise27. 記住邏輯
exercise5.更多的變量和打印
exercise7.更多的打?。ㄝ敵觯?/span>
附錄 A-練習(xí) 13:輸出文件 (cat)
exercise39.字典,可愛的字典

exercise41.學(xué)會(huì)說面向?qū)ο?/h1>

在這個(gè)練習(xí)中,我要教你如何說“面向?qū)ο蟆?,我要給你一些你需要知道定義的詞。然后我會(huì)給你一組你必須了解的句子,最后我會(huì)給你一大堆練習(xí),你必須完成這練習(xí)題,將我給你的句子轉(zhuǎn)化成自己的詞匯。

單詞解釋

class(類):告訴 python 去創(chuàng)建一個(gè)新類型。 object(對(duì)象):有兩種意思,事物的基本類型,或者事物的實(shí)例化。 instance(實(shí)例):你通過 python 創(chuàng)建一個(gè)類所獲得的。 def:用來在類中定義一個(gè)函數(shù)。 self:在一個(gè)類包含的函數(shù)中,self 是一個(gè)用來訪問實(shí)例或?qū)ο蟮淖兞俊?inheritance:概念,表示一個(gè)類可以繼承另一個(gè)類的特征,就像你和你的父母。 composition:概念,表示一個(gè)類可以包含其他類,就像汽車輪子。 attribute:類所擁有的特性,通常是變量。 is-a:慣用語,表示一個(gè)東西繼承自另一個(gè)東西(a),像在“鮭魚”是“魚”。 has-a:慣用語,表示由其他事情或有一個(gè)特征(a),如“鮭魚有嘴?!?/p>

花一些時(shí)間制作一些卡片用來記憶這些術(shù)語。像往常一樣,直到你完成這個(gè)練習(xí)后,這都不會(huì)有太多的意義,但是首先你需要知道的基本詞匯。

短語解釋

接下來,在左邊有一個(gè) Python 代碼片段列表,右面是他們的解釋 class X(Y):創(chuàng)建一個(gè)叫 X 的類,并繼承 Y。 class X(object): def init(self, J):類 X 有一個(gè)init方法,該方法有 self 和 J 兩個(gè)參數(shù)。 class X(object): def M(self, J):類 X 有一個(gè)叫 M 的函數(shù),該函數(shù)有 self 和 J 兩個(gè)參數(shù)。 foo = X():給 foo 賦值為類 X 的一個(gè)實(shí)例。 foo.M(J):從 foo 里調(diào)用 M 函數(shù),傳遞的參數(shù)為 self 和 J。 foo.K = Q:從 foo 里調(diào)用 K 屬性,并將其設(shè)置為 Q。

你可以把上面看到的所有的 X, Y, M, J, K, Q, 以及 foo 看做空白的坑,比如,我還可以這么寫:

1.創(chuàng)建一個(gè)叫??的類繼承 Y 2.類??有一個(gè)init方法,該方法有 self 和???jī)蓚€(gè)參數(shù)。 3.類??有一個(gè)叫??的函數(shù),該函數(shù)有 self 和???jī)蓚€(gè)參數(shù)。 4.給 foo 賦值為類??的一個(gè)實(shí)例。 5.從 foo 里調(diào)用??函數(shù),傳遞的參數(shù)為 self 和??。 6.從 foo 里調(diào)用??屬性,并將其設(shè)置為??。

同樣的,把這些寫到卡片上,牢牢記住它們??ㄆ那懊鎸懮?python 的小段代碼,背面寫上它們的解釋,你要做到每當(dāng)你看到正面的代碼段的時(shí)候,能立即說出后面的解釋。

組合練習(xí)

最后給你準(zhǔn)備的是將單詞和短語結(jié)合起來練習(xí)。我希望你能做到下面的要求:

1.準(zhǔn)備好短語的卡片,并拼命的練習(xí) 2.翻轉(zhuǎn)卡片,閱讀這些解釋語句,挑選出語句中包含單詞練習(xí)中單詞的卡片 3.通過這些語句拼命練習(xí)這些單詞 4.堅(jiān)持練習(xí),直到你厭煩了,休息一下,然后繼續(xù)練習(xí)

閱讀測(cè)試

下面有一個(gè) python 腳本,這個(gè)腳本會(huì)以無盡模式訓(xùn)練你,檢驗(yàn)?zāi)闼莆盏倪@些單詞。這是一個(gè)很簡(jiǎn)單的腳本,它實(shí)現(xiàn)的功能是使用了一個(gè)叫做 urllib 的類庫(kù)來下載我提供的單詞列表。下面就是這個(gè)腳本,你需要正確的輸入并命名為 oop_test.py:

import random
from urllib import urlopen
import sys

WORD_URL = "http://learncodethehardway.org/words.txt"
WORDS = []

PHRASES = {
    "class %%%(%%%):":
      "Make a class named %%% that is-a %%%.",
    "class %%%(object):\n\tdef __init__(self, ***)" :
      "class %%% has-a __init__ that takes self and *** parameters.",
    "class %%%(object):\n\tdef ***(self, @@@)":
      "class %%% has-a function named *** that takes self and @@@ parameters.",
    "*** = %%%()":
      "Set *** to an instance of class %%%.",
    "***.***(@@@)":
      "From *** get the *** function, and call it with parameters self, @@@.",
    "***.*** = '***'":
      "From *** get the *** attribute and set it to '***'."
}

# do they want to drill phrases first
if len(sys.argv) == 2 and sys.argv[1] == "english":
    PHRASE_FIRST = True
else:
    PHRASE_FIRST = False

# load up the words from the website
for word in urlopen(WORD_URL).readlines():
    WORDS.append(word.strip())

def convert(snippet, phrase):
    class_names = [w.capitalize() for w in
                   random.sample(WORDS, snippet.count("%%%"))]
    other_names = random.sample(WORDS, snippet.count("***"))
    results = []
    param_names = []

    for i in range(0, snippet.count("@@@")):
        param_count = random.randint(1,3)
        param_names.append(', '.join(random.sample(WORDS, param_count)))

    for sentence in snippet, phrase:
        result = sentence[:]

        # fake class names
        for word in class_names:
            result = result.replace("%%%", word, 1)

        # fake other names
        for word in other_names:
            result = result.replace("***", word, 1)

        # fake parameter lists
        for word in param_names:
            result = result.replace("@@@", word, 1)

        results.append(result)

    return results

# keep going until they hit CTRL-D
try:
    while True:
        snippets = PHRASES.keys()
        random.shuffle(snippets)

        for snippet in snippets:
            phrase = PHRASES[snippet]
            question, answer = convert(snippet, phrase)
            if PHRASE_FIRST:
                question, answer = answer, question

            print question

            raw_input("> ")
            print "ANSWER:  %s\n\n" % answer
except EOFError:
    print "\nBye"

運(yùn)行這個(gè)腳本,嘗試將這些“面向?qū)ο蟮亩陶Z”翻譯成自己的語言。你應(yīng)該能看到字典 PHRASES 中包含了剛才練習(xí)的所有的短語。

練習(xí)將英語轉(zhuǎn)換為代碼

接下來,你可以使用"english"選項(xiàng)來執(zhí)行腳本,這樣你可以反過來練習(xí):

$ python oop_test.py english

記住這些短語使用的是無意義的詞匯。學(xué)習(xí)閱讀代碼的一部分是停止糾結(jié)這些用于變量和類的名字的真實(shí)意義。人們常常會(huì)在讀到一個(gè)像“cork”的詞時(shí)突然迷糊,因?yàn)檫@個(gè)詞會(huì)混淆他們的意義。在這個(gè)例子中,"Cork"只是用來作為一個(gè)類的名字。不要給它任何意義的解釋。

閱讀更多的代碼

你現(xiàn)在需要繼續(xù)閱讀更多的代碼,閱讀你找到的代碼中這些你剛學(xué)過的短語表達(dá)。你需要找出文件中所有的類,然后執(zhí)行以下步驟:

1.給出每一個(gè)類的名字,并說出這些類繼承哪些類 2.列出每個(gè)類所包含的函數(shù),以及函數(shù)需要的參數(shù) 3.列出類所有的屬性 4.對(duì)每個(gè)屬性,給出屬性的類型

這個(gè)練習(xí)的目的是通過閱讀真實(shí)的代碼,學(xué)習(xí)你剛才學(xué)到的短語是如何使用的。如果你練習(xí)的足夠所,你應(yīng)該能看到這些模式在代碼中向你大聲呼喊,然而在這之前,他們是你所不知道的,只是模糊的空白而已。

常見問題

Q: 這句代碼 result = sentence[:]實(shí)現(xiàn)了什么

這是 python 中用來復(fù)制列表的一種方式。你使用了列表的分割切片語法[:],得到列表從第一個(gè)到最后一個(gè)元素的切片。

Q: 這個(gè)腳本很難跑起來啊

你需要輸入這些代碼并保證它能運(yùn)行。這個(gè)腳本可能會(huì)有一些小問題,但是它并不復(fù)雜。試著用你到目前為止學(xué)到的東西來調(diào)試腳本,每輸入一行,確認(rèn)一下是否與我的代碼一樣,并在網(wǎng)上搜索你所不了解的所有問題。

Q: 這對(duì)我來說太難了!

你可以的,慢慢來,如果需要的話,你逐個(gè)字符的輸入,然后弄明白它是做什么的。