ex40

讲述库,类和对象的关系

库像字典,类像库,对象像导入(import)

从一堆东西中取出一些东西的方法有三个:字典、库和类。

ex41

学习面向对象

class 告诉Python建立一个事物的新类型(type)

object 有两个意思,一个是事物最基本的类型(type),一个是事物的任何实例

instance 当你告诉Python去创建一个类时你得到的东西

def 在类里定义一个方法

self 在类的方法里,self是一个变量,目的是让实例或对象访问。

inheritance 一个类可以从其他类里继承特征,就像你和你的父母

composition 一个类由其他类作为一部分组成,比如汽车有四个轮子。

attribute 一种类有拥有的从组合里而来的特性,通常是变量

is-a 一些事情继承与某事物。比如 鲑鱼属于鱼(a salmon is-a fish)。

has-a 一个事物由其他事物组成,或者有什么特征。比如鲑鱼有一张嘴(a salmon has-a mouth)。

class X(Y) 创建一个名为X的类,属于Y(is-a Y)

class X(object): def init(self, J) clssX 有方法 __init__,方法里有参数self和J

class X(object): def M(self, J) classX 有方法M,方法里有参数self和J

foo = X() 将foo设置为X()的一个实例

foo.M(J) 从foo里得到方法M,有参数self和J调用M

foo.K = Q 从foo得到属性K,并将它设为Q。

对ex41中程序的理解

输入:单词库和模板

输出:随机输出的带有单词库的句子,输入内容后,回车输出答案

方法:

  1. 读取单词库

  2. 建立模板(因为问题和答案对应,应为字典)

  3. 随机抽取模板

  4. 随机抽取单词库,限制单词数量

  5. 组合抽好的模板和单词

  6. 打印组合中问题,input输入,打印答案

  7. 循环执行步骤3—6

import random
from urllib.request import urlopen
import sys


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

# 类的符号设置为%,__init__的参数、方法、变量和字符串的符号设置为*, 实例方法参数的符号设置为@
PHRASES = {
    "class %%%(%%%)":
        "Make a class named %%% that is-a %%%.",
    "class %%%(object):\n\tdef __init__(self, ***)":
        "class %%% has-a __init__ that takes self and *** params",
    "class %%%(object):\n\tdef ***(self, @@@)":
        "class %%% has a function *** that takes self and @@@ params",
    "*** = %%%()":
        "Set *** to an instance of class %%%.",
    "***.***(@@@)":
        "From *** get the *** function, call it with params self and @@@.",
    "***.*** = '***'":
        "From *** get the *** attribute and set it to '***'."
}

# do they want to drill phrases first
# 检测输入的参数是否为2个以及第二个参数是否为english
if len(sys.argv) == 2 and sys.argv[1] == "english":
    PHRASES_FIRST = True
else:
    PHRASES_FIRST = False

# load up the words from the website
# 加载单词库的单词
for word in urlopen(WORD_URL).readlines():
    WORDS.append(str(word.strip(), encoding="utf-8"))

# random.sample(a,num)的作用是根据num的数量,从a中随机挑选相应数量的元素。

# 随机抽取单词库单词,限制单词数量
# 组合抽取好的模板和单词
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
        #.replace的max设置为1,保证替换的词不会重复。
        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 goint until they hit CTRL-D
# 随机抽取模板
# 通过convert()调用组合好的问题
# 打印组合中的问题
# input()
# 打印组合中答案
# 循环执行


try:
    while True:
        snippets = list(PHRASES.keys())
        random.shuffle(snippets)

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

            input("> ")
            print(f"ANSWER: {answer}\n\n")
except EOFError:
    print("\nBye")