Learn Python The Hard Way学习(41) - 学习面向对象

这一章学习面向对象,我做的就是给出一组你想知道的单词的定义。然后给出一些语句的解释,最后是一个练习巩固你的知识。

词语练习
  • class:告诉python创造一个新的东西
  • object:两个意思:最基本的东西和任何实例化的东西。
  • instance:创建一个类得到的东西。
  • def:在类中创建一个函数。
  • self:在类里面的函数中使用,是实例和object能访问的变量。
  • inheritance:继承,一个类可以继承另一个类,像你和你的父母。
  • composition:一个类可以包含另外一个类,就像汽车包含轮胎。
  • attribute:一个属性类,通常包括变量。
  • is-a:表示继承关系
  • has-a:包含关系
通过卡片记忆这些词语,单独的词语通常没什么意义,不过我还是要先知道它们的存在。

短语练习
  1. class x(y):创建一个类x,它继承了y类。
  2. class x(object):def __init__(self,j):x类包含__init__函数,函数中有self和j参数。
  3. class x(object):def m(self,j):类x包含m函数,m函数有self和j两个参数。
  4. foo = x():设置foo为类x的实例化。
  5. foo.m(j):通过foo调用m函数,参数是self和j。
  6. foo.k = q:通过foo给k属性赋值为q。
上面那些x,y,m,q等等都是可以变的。

把上面这些也写到卡片上记忆。

组合练习
组合词语和句子前,我们要做下面这些准备:
  1. 拿一张短语卡,练习上面的代码。
  2. 翻过来,读句子的解释,句子里面都包含一些词语,找到对应的词语卡。
  3. 练习句子对应的词语。
  4. 反复练习。
一个阅读测试
这是一个简单的脚本可以让你用来做练习,它只做一件事,就是使用一个urllib的库去下载一个单词列表。我们把下面的代码写到opp_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 '***'."
}


PHRASE_FIRST = False
if len(sys.argv) == 2 and sys.argv[1] == "english":
    PHRASE_FIRST = True


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


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"


运行这个例子,它会尽可能准确的回答问题。
root@he-desktop:~/mystuff# python oop_test.py 
class Deer(object):
def __init__(self, connection)
ANSWER: class Deer has-a __init__ that takes self and connection parameters.


class Cause(Agreement):
ANSWER: Make a class named Cause that is-a Agreement.


animal.driving(arch)
ANSWER: From animal get the driving function, and call it with parameters self, arch.


cat = Aftermath()
ANSWER: Set cat to an instance of class Aftermath.


cork.card = 'attempt'

练习从英语到代码
运行的时候在后面多加一个english的参数,运行如下:
root@he-desktop:~/mystuff# python oop_test.py english
Make a class named Arm that is-a Bird.
ANSWER: class Arm(Bird):


From cloud get the calculator attribute and set it to 'committee'.
ANSWER: cloud.calculator = 'committee'


Set chair to an instance of class Detail.

这些句子只是用一些常用的词语表示,这些词语仅仅是变量名或者类名,没有其他的意思,不要按照字面的意思去理解随机取出的单词。

阅读更多代码
你现在基本可以读懂所有代码了,当遇到关于类的代码时,做下面这些事情:
  1. 写下类的名称,和它继承于哪个类。
  2. 列出类的函数和参数。
  3. 列出用在self上的属性。
  4. 为每个属性标注类名。
看真实的代码是为了把我们学习到的短语匹配到代码中。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值