在這個(gè)練習(xí)中,我要教你如何說(shuō)“面向?qū)ο蟆?,我要給你一些你需要知道定義的詞。然后我會(huì)給你一組你必須了解的句子,最后我會(huì)給你一大堆練習(xí),你必須完成這練習(xí)題,將我給你的句子轉(zhuǎn)化成自己的詞匯。
class(類(lèi)):告訴python去創(chuàng)建一個(gè)新類(lèi)型。object(對(duì)象):有兩種意思,事物的基本類(lèi)型,或者事物的實(shí)例化。instance(實(shí)例):你通過(guò)python創(chuàng)建一個(gè)類(lèi)所獲得的。def:用來(lái)在類(lèi)中定義一個(gè)函數(shù)。self:在一個(gè)類(lèi)包含的函數(shù)中,self是一個(gè)用來(lái)訪問(wèn)實(shí)例或?qū)ο蟮淖兞?。inheritance:概念,表示一個(gè)類(lèi)可以繼承另一個(gè)類(lèi)的特征,就像你和你的父母。composition:概念,表示一個(gè)類(lèi)可以包含其他類(lèi),就像汽車(chē)輪子。 attribute:類(lèi)所擁有的特性,通常是變量。is-a:慣用語(yǔ),表示一個(gè)東西繼承自另一個(gè)東西(a),像在“鮭魚(yú)”是“魚(yú)”。 has-a:慣用語(yǔ),表示由其他事情或有一個(gè)特征(a),如“鮭魚(yú)有嘴?!?
花一些時(shí)間制作一些卡片用來(lái)記憶這些術(shù)語(yǔ)。像往常一樣,直到你完成這個(gè)練習(xí)后,這都不會(huì)有太多的意義,但是首先你需要知道的基本詞匯。
接下來(lái),在左邊有一個(gè)Python代碼片段列表,右面是他們的解釋class X(Y)
:創(chuàng)建一個(gè)叫X的類(lèi),并繼承Y。class X(object): def __init__(self, J)
:類(lèi)X有一個(gè)__init__
方法,該方法有self和J兩個(gè)參數(shù)。class X(object): def M(self, J)
:類(lèi)X有一個(gè)叫M的函數(shù),該函數(shù)有self和J兩個(gè)參數(shù)。foo = X()
:給foo賦值為類(lèi)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 看做空白的坑,比如,我還可以這么寫(xiě):
- 創(chuàng)建一個(gè)叫??的類(lèi)繼承Y
- 類(lèi)??有一個(gè)
__init__
方法,該方法有self和???jī)蓚€(gè)參數(shù)。- 類(lèi)??有一個(gè)叫??的函數(shù),該函數(shù)有self和???jī)蓚€(gè)參數(shù)。
- 給foo賦值為類(lèi)??的一個(gè)實(shí)例。
- 從foo里調(diào)用??函數(shù),傳遞的參數(shù)為self和??。
- 從foo里調(diào)用??屬性,并將其設(shè)置為??。
同樣的,把這些寫(xiě)到卡片上,牢牢記住它們。卡片的前面寫(xiě)上python的小段代碼,背面寫(xiě)上它們的解釋?zhuān)阋龅矫慨?dāng)你看到正面的代碼段的時(shí)候,能立即說(shuō)出后面的解釋。
最后給你準(zhǔn)備的是將單詞和短語(yǔ)結(jié)合起來(lái)練習(xí)。我希望你能做到下面的要求:
- 準(zhǔn)備好短語(yǔ)的卡片,并拼命的練習(xí)
- 翻轉(zhuǎn)卡片,閱讀這些解釋語(yǔ)句,挑選出語(yǔ)句中包含單詞練習(xí)中單詞的卡片
- 通過(guò)這些語(yǔ)句拼命練習(xí)這些單詞
- 堅(jiān)持練習(xí),直到你厭煩了,休息一下,然后繼續(xù)練習(xí)
下面有一個(gè)python腳本,這個(gè)腳本會(huì)以無(wú)盡模式訓(xùn)練你,檢驗(yàn)?zāi)闼莆盏倪@些單詞。這是一個(gè)很簡(jiǎn)單的腳本,它實(shí)現(xiàn)的功能是使用了一個(gè)叫做urllib
的類(lèi)庫(kù)來(lái)下載我提供的單詞列表。下面就是這個(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ǔ)”翻譯成自己的語(yǔ)言。你應(yīng)該能看到字典PHRASES
中包含了剛才練習(xí)的所有的短語(yǔ)。
接下來(lái),你可以使用"english"選項(xiàng)來(lái)執(zhí)行腳本,這樣你可以反過(guò)來(lái)練習(xí):
$ python oop_test.py english
記住這些短語(yǔ)使用的是無(wú)意義的詞匯。學(xué)習(xí)閱讀代碼的一部分是停止糾結(jié)這些用于變量和類(lèi)的名字的真實(shí)意義。人們常常會(huì)在讀到一個(gè)像“cork”的詞時(shí)突然迷糊,因?yàn)檫@個(gè)詞會(huì)混淆他們的意義。在這個(gè)例子中,"Cork"只是用來(lái)作為一個(gè)類(lèi)的名字。不要給它任何意義的解釋。
你現(xiàn)在需要繼續(xù)閱讀更多的代碼,閱讀你找到的代碼中這些你剛學(xué)過(guò)的短語(yǔ)表達(dá)。你需要找出文件中所有的類(lèi),然后執(zhí)行以下步驟:
- 給出每一個(gè)類(lèi)的名字,并說(shuō)出這些類(lèi)繼承哪些類(lèi)
- 列出每個(gè)類(lèi)所包含的函數(shù),以及函數(shù)需要的參數(shù)
- 列出類(lèi)所有的屬性
- 對(duì)每個(gè)屬性,給出屬性的類(lèi)型
這個(gè)練習(xí)的目的是通過(guò)閱讀真實(shí)的代碼,學(xué)習(xí)你剛才學(xué)到的短語(yǔ)是如何使用的。如果你練習(xí)的足夠所,你應(yīng)該能看到這些模式在代碼中向你大聲呼喊,然而在這之前,他們是你所不知道的,只是模糊的空白而已。
result = sentence[:]
實(shí)現(xiàn)了什么這是python中用來(lái)復(fù)制列表的一種方式。你使用了列表的分割切片語(yǔ)法
[:]
,得到列表從第一個(gè)到最后一個(gè)元素的切片。
你需要輸入這些代碼并保證它能運(yùn)行。這個(gè)腳本可能會(huì)有一些小問(wèn)題,但是它并不復(fù)雜。試著用你到目前為止學(xué)到的東西來(lái)調(diào)試腳本,每輸入一行,確認(rèn)一下是否與我的代碼一樣,并在網(wǎng)上搜索你所不了解的所有問(wèn)題。
你可以的,慢慢來(lái),如果需要的話,你逐個(gè)字符的輸入,然后弄明白它是做什么的。
更多建議: