41.学习面向对象术语
前言
这是一个学习面向对象术语的程序练习。
一、专有词汇练习
类(class):告诉Python创建一个新的类。
对象(object):两个意思,即最基本的东西,或者某样东西的实例。
实例(instance):这是让Python创建一个类时得到的东西。
def:这是在类里面定义函数的方法。
self:在类的函数中,self指代被访问的对象或者实例的一个变量。
继承(inheritance):指一个类可以继承另一个类的特性,和父子关系类似。
组合(composition):指一个类可以将别的类作为它的部件构建起来,有点像车子和车轮的关系。
属性(attribute):类的一个属性,它来自于组合,而且通常是一个变量。
是什么(is-a):用来描述继承关系,如Salmon is-a Fish(蛙鱼是一种鱼)。
有什么(has-a):用来描述某个东西是由另外一些东西组成的,或者某个东西有某个特征,如Salmon has-a mouth(蛙鱼有一张嘴)。
二、措辞联系
接下来给出一些代码,以及用来描述代码的句子:
代码 | 描述 |
---|---|
class X(Y) | “创建一个叫X的类,它是Y的一种。” |
class X(object): def __init__(self, J) | “类X有一个__init__,它接收self和J作为参数。” |
class X(object): def M(self, J) | “类X有一个名为M的函数,它接收self和J作为参数。” |
foo = X() | “将foo设为类X的一个实例。” |
foo.M(J) | “从foo中找到M函数,并使用self和J参数调用它”。 |
foo .K = Q | foo.K = Q:“从foo获取K属性,并将其设置为Q。” |
三、代码测试
运行这段代码,练习面向对象术语。
在Window上键入Python就可以进行练习。
python ex41.py english
import random
from urllib.request import urlopen
import sys
Word_url = 'http://learncodethehardway.org/words.txt' # 一个包含网址的字符串,之后调用一个方法打开这个网址,网址里面是很多行单词。
Words = [] # 一个空列表
phrases = { # 一个字典,键是操作,值是说明,得到一个字典,key为问题,value为答案,其中%%%代表类,***代表参数或函数,@@@代表参数
"class %%%(%%%)":
"创建一个叫%%%的类,它是%%%的一种.",
"class %%%(object): \n\t def __init__(self, ***)":
"类%%%有一个__init__,它接收self和***作为参数.",
"class %%%(object): \n\t def ***(self, @@@)":
"类%%%有一个名为***的函数,它接收self和@@@作为参数.",
"*** = %%%()":
"将***设为类%%%的一个实例.",
"***.***(@@@)":
"从***中找到***函数,并使用self和@@@参数调用它.",
"***.*** = '***":
"从***获取***属性,并将其设置为'***'."
}
# do they want to drill phrases first
if len(sys.argv) == 2 and sys.argv[1] == 'english': # 在这个条件下,phrase_first 为True,得到一个布尔值
phrase_first = True
else:
phrase_first = False
# load up the words from the website
for word in urlopen(Word_url).readlines(): # 读取网址里的每一行的单词
Words.append(str(word.strip(), encoding = 'utf-8')) # 将每一行单词除去头尾空格、以 utf-8 编码格式设为字符串、加到Words列表中;得到一个Words列表
def convert(snippet, phrase): # 输入两个参数,根据情况,替换参数中的各类符号,完成后以列表返回
class_names = [w.capitalize() for w in # 从下面的随机列表中取出一个w,将w设为首字母大写,作为列表class_names的值,得到一个列表
random.sample(Words, snippet.count('%%%'))] # 统计snippet中‘%%%’出现的次数x,从Words中随机取出x个元素
other_names = random.sample(Words, snippet.count('***')) # 统计snippet中‘***’的次数,从Words中取出这个数个元素,作为列表other_names的值
results = [] # 一个空列表,待使用
param_names = [] # 一个空列表,待使用
for i in range(0, snippet.count('@@@')): # i在范围内时
param_count = random.randint(1,3) # 通过random.randint(1,3)返回1-3之间的整数,赋给param_count,得到一个param_count变量
param_names.append(', '.join(
random.sample(Words, param_count))) # 从Words列表中取出param_count个值作为新列表,通过join方法,以「,」连接成字符串,赋给param_names,得到一个param_names字符串
for sentence in snippet, phrase: # 循环两次
result = sentence[:] # 将sentence复制给result,其实也就是把参数复制给result,但复制的是哪个?
# fake class names
for word in class_names:
result = result.replace('%%%', word, 1) # 用网址里的单词(class_names,上边处理的,来自网址中)替换‘%%%’,最多不超过1次
# fake other names
for word in other_names:
result = result.replace('***', word, 1) # 用网址里的单词(other_names,上边处理的,来自网址中)替换‘***’,最多不超过1次
# fake parameter lists
for word in param_names:
result = result.replace('@@@',word, 1) # 用param_names替换‘@@@’,最多不超过1次
results.append(result) # 将result加入results列表中
return results # 将results列表返回
# keep going until the hit CTRL_D
try:
while True:
snippets = list(phrases.keys()) # 将phrases的keys,作为列表赋予给snippets
random.shuffle(snippets) # 把snippets列表打乱
for snippet in snippets:
phrase = phrases[snippet] # phrase为字典phrases中key为snippet的值
question, answer = convert(snippet, phrase) # 两个参数带入函数处理,把返回的值按顺序赋给question和answer,第一个是question,第二个是answer
if phrase_first:
question, answer = answer, question
print(question)
input('> ')
print(f'answer: {answer}\n\n')
except EOFError:
print('\nBye')
总结
以上内容介绍了Python的面向对象术语,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。