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中程序的理解
输入:单词库和模板
输出:随机输出的带有单词库的句子,输入内容后,回车输出答案
方法:
-
读取单词库
-
建立模板(因为问题和答案对应,应为字典)
-
随机抽取模板
-
随机抽取单词库,限制单词数量
-
组合抽好的模板和单词
-
打印组合中问题,input输入,打印答案
-
循环执行步骤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")