练习41

一些示意和概念

   class X(Y) : “Make a class named X that is-a Y.”

   class X(object): def init(self, J)类 X 有一个带有 self 和 J 参数的 init 函数。 (“class X has-a init that takes self and J parameters.”)

   class X(object): def M(self, J): 类 X 有一个带有 self 和 J 参数的 M 函数。 (“class X has-a function named M that takes self and J parameters.”)

**注意这边init和M是不一样的**

   foo = X(): 设 foo 为类 X 的一个实例。 (“Set foo to an instance of class X.”)

   foo.M(J)从 foo 那里获取 M 函数,并用 self 和 J 参数来调用它。 (“From foo, get the M function, and call it with parameters self, J.”)如果啥都没说,那就是只用self参数

   foo.K = Q从 foo 那里获取 K 属性,并设它为 Q。 (“From foo, get the K attribute, and set it to Q.”)

接下来是ex41.py的代码,首先需要import三个库,random,urlopen,sys,给word链接,给words的一个list,然后把需要的屏蔽后的短句当成一个phrases输进去。

在此省略打字部分

import random
from urllib.request import urlopen
import sysWORD_URL = "http://learncodethehardway.org/words.txt"
WORDS = []PHRASES = {}

然后是对读取的文件名以及解析语种进行检验,if语句,len长度是检验是否输入文件中含有两个变量,以及满足使用英语作为语言的要求

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

这段为从网络上下载数据,使用导入的urlopen函数,关于urlopen函数

函数原型如下:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) 

直接用urllib.request模块的urlopen()获取页面,page的数据格式为bytes类型,需要decode()解码,转换成str类型。所以与解码语言匹配上了,上述使用的英语。采用readline依次读行

#load up the words form the website
for word in urlopen(WORD_URL).readlines():WORDS.append(str(word.strip(), encoding = "utf-8"))

str为字符串类型,str函数为掐头去尾函数,str() 函数将指定的值转换为字符串。语法如下:

str(object, encoding=encoding, errors=errors)

定义转化函数

##这个函数把首字母变大写 capitalize(),其他小写,把w中的第一个字符变为大写
        #sample函数,从列表里抽几个,这边的几个是这段文字出现了几个“%%%”,然后以list形式返回,count()函数为统计这一段文字中出现括号内文文字的个数。

将results和param作为空的list等待添加

def convert(snippet, phrase):class_names = [w.capitalize() for w inrandom.sample(WORDS,snippet.count("%%%"))]other_names = random.sample(WORDS, snippet.count("***"))results = []param_names = []

然后开始函数内部循环

这是第一个层次的,param_count为随机数,param_names中添加了肉干个随机例子

    for i in range(0, snippet.count("@@@")):param_count = random.randint(1,3)param_names.append(', '.join(random.sample(WORDS, param_count)))

第二个层次的循环

result等于sentence这个list的切片,然后通过区分这个语句属于哪一类,分别对语句进行替换,再把这个句子加到results里面去。最后返回results这个列表

    for sentence in snippet, phrase:result = sentence[:]#fake class namesfor word in class_names:result = result.replace("%%%", word, 1)#fake other namesfor word in other_names:result = result.replace("***", word, 1)#fake parameter listsfor word in param_names:result = result.replace("%%%", word, 1)results.append(result)return results

最后进入try语句,如果是代码未出错,则会一直执行下去,否则跳出至except,正确条件如下,则执行对snippets中的所有元素随机排序,然后调用convert函数

try:while True:snippets = list(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)input("> ")print(f"ANSWER: {answer}\n\n")except EOFError:print("\nBye")

———————————————————————————————————————————

练习42 对象和类

直接写在注释里了

##Animal is-a object (yes,sort of confusing)look at the extra credit
class Animal(object):pass
##占位因为如果定义一个空函数程序会报错,当你没有想好函数的内容是可以用 pass 填充,使程序可以正常运行
##定义狗是Animal的一个子类
class Dog(Animal):def __init__(self, name):##他的初始函数包括他自己的属性,以及具有name的属性self.name = name##同理
class Cat(Animal):def __init__(self, name):self.name = name##定义一个不同于object的新类
class Person(object):def __init__(self, name):##他的初始函数包括他自己的属性,以及具有name的属性self.name = name##这样确保 self.pet 这个类的属性被设为默认的 None。self.pet = None##employee属于person的一个子类,多了一薪水属性
class Employee(Person):def __init__(self, name, salary):##运行父类的 init ,从父类中继承super(Employee, self).__init__(name)##定义salary属性self.salary = salary##定义鱼类
class Fish(object):pass##定义这啥玩意儿我也不知道
class Salmon(object):pass##定义一个哈利波特类
class Halibut(object):pass##rover is-a Dog
Rover = Dog("Rover")##Satan is-a Cat
Satan = Cat("Satan")##Mary is-a Person
Mary = Person("Mary")##Mary has-a cat,pet属性的值为Satan
Mary.pet = Satan##Frank is-a employee,属性salary为12000
Frank = Employee("Frank", 120000)##同mary
Frank.pet = Rover##
Flipper = Fish()##??
Crouse = Salmon()##??
Harry = Halibut()

———————————————————————————————————————————

练习43比较复杂还没玩明白,先看个练习44

———————————————————————————————————————————

练习44

子类和父类以及继承组合关系,肖恩是这么写的,主要有隐式、显式、覆盖后调用三种方式,他的核心如下。

  • 子类上的操作会覆盖父类上的操作。

  • 子类上的操作会更改父类上的操作。

  • 对子类的行为意味着对父类的行为。

隐式继承:

在类中声明,child是parent的一个子类,即子类可以调用父类中的操作,父类定义了一个implicit函数,它同样对子类适用

class Parent(object):def implicit(self):print("PARENT implicit()")class Child(Parent):passdad = Parent()
son = Child()dad.implicit()
son.implicit()
#即使我在第 16 行调用了 son.implicit(),并且 Child 里面也没有定义一个隐式函数
#它仍然可以正常运行,它调用了在 Parent 中定义的那个函数
#这表明如果将函数放在基类中(比如 Parent),然后所有子类(比如 Child)会自动获得这些特性。
#对于需要写很多重复代码的类来说非常方便。

显式继承:

虽然child是parent的一个子类,但是他在调用同名函数中定义自己的版本来重写override函数

class Parent(object):def override(self):print("PARENT override()")class Child(Parent):def override(self):print("CHILD override()")dad = Parent()
son = Child()dad.override()
son.override()
#分别定义自己的版本来写函数

修改前后

同样是定义两个类,定义两个同名函数,但是定义子类中多定一个altered函数,它调用了super,这个super获得了parent.altered版本,可以把他理解为,它意识到需要继承,并会为你获取 Parent 类。你应该能够把这个理解为“使用参数 Child 和 self 来调用 super,然后在它返回的任何地方调用 altered 函数”。Parent.altered 版本的函数运行,并打印出 Parent 的信息。

class Parent(object):def altered(self):print("PARENT altered()")class Child(Parent):def altered(self):print("CHILD, BEFORE PARENT altered()")super(Child, self).altered()print("CHILD, AFTER PARENT altered()")dad = Parent()
son = Child()dad.altered()
son.altered()

super()与init初始化

class Child (Parent):def __init__(self, stuff):self.stuff = stuffsuper(Child, self).__init__( )

直接继承父类,和上面的child.altered很像

【lphtw】第五弹笔记ex41-ex46相关推荐

  1. 每日三道前端面试题--vue 第五弹

    每日三道前端面试题--vue 第五弹 DOM 渲染在哪个周期中就已经完成? 说明Vue父组件向子组件传值的方法(代码或文字描述均可)? 请列举axios的配置项及含义(五条)? DOM 渲染在哪个周期 ...

  2. 微信支付 APP端 后端 第四-五弹 退款定时任务 账单下载

    目录 第四弹 退款定时任务 成果展示: 1.设计思路 2.代码实现 2.1数据库查询订单 2.2定时任务 检查退款订单 2.3调用微信支付 get请求 统一配置(如果是看了前几篇的友友 前面有一样的 ...

  3. 计算机网络第五弹——运输层

    计算机网络第五弹--运输层 彩蛋 计算机网络谢希仁第七版原版ppt获取方式:公众号后台回复"N3"即可获取. 由于公众号不支持显示LaTeX公式且公众号排版混乱,建议大家关注微信公 ...

  4. 威廉森《宏观经济学》第五版笔记和课后答案

    完整版在线阅读>>> http://wwxx.100xuexi.com/Ebook/966583.html 本书是威廉森<宏观经济学>(第5版)教材的学习辅导书,主要包括 ...

  5. Primer c++第五版笔记2(到第9章完)

    目录 Primer c++第五版笔记2(到第9章完) 8 IO库 8.1 IO类 8.1.1 IO对象无拷贝或赋值 8.1.2 条件状态 8.1.3 管理输出缓冲 8.2 文件输入输出 8.2.1 使 ...

  6. DirectX12龙书--第五章笔记

    需要龙书电子版的可联系我,部分图片太大,csdn导入不了,可访问我的github图床github或者在书里面查看. DirectX12龙书第五章笔记 第五章 5.1 3D视觉即错觉? 5.2 模型的表 ...

  7. 【第五弹】经典移植至IOS端、经典合集

    有一段时间没分享拉,额...那是因为我在找哪些适合分享给大家的啊,哈哈哈 虽然这次游戏不多(其实还有Fifa16,模拟人生畅玩版,但是服务器好像都崩了.不能玩~~~所以没传了),但是也是寻找了一大部分 ...

  8. CreateFile | ReadFile | WriteFile - WINDOWS API 第五弹 C++创建任意格式的文件用于读取和写入。

    Windows api系列第五弹强烈来袭,本期介绍Windows上c++有关文件创建.读取和写入的api:CreateFile.ReadFile.WriteFile. 目录 一.CreateFile ...

  9. 梁宁《产品思维30讲》 笔记第五弹——用户体验

    本次与大家分享的是梁大师讲的用户体验板块:18~22讲 之前三个模块,我们希望解决的问题是你能够情绪纠偏.认知纠偏,不再只从原生感受上来看问题.接着我们讲的是建设系统的能力.厚积薄发,"厚积 ...

最新文章

  1. Oracle新一代数据库机 助所有规模企业迈向云端
  2. 阿里云CentOS 7.4 配置Nginx、PHP、Mariadb
  3. 图书管理系统可行性分析报告范例_会做可行性分析报告贺州专家团队*金
  4. java数组复制_Java自学-数组 复制数组
  5. go设置后端启动_Go语言基础(十四)
  6. (https)nginx - tomcat(http)
  7. springMVC学习(10)-上传图片
  8. 如何生成网站地图(Sitemap)
  9. uni-app 连接蓝牙打印机
  10. maven 阿里源配置完整 亲测有效
  11. win10桌面不见了如何找到
  12. 2、按键检测例程-FPGA-个人实验总结
  13. 主板维修从入门到精通
  14. Mybatis-Plus多表关联查询的使用
  15. html/css--flex布局
  16. 【Unity3D】Animator动画播放时卡死在第一帧BUG系列
  17. 烂泥:利用PhotoShop自定义艺术字体
  18. 2021年G1工业锅炉司炉考试内容及G1工业锅炉司炉考试技巧
  19. scp指令,进行服务器之间数据传输
  20. rtl8211 smi读取_DM8148+RTL8211网卡uboot调试

热门文章

  1. 某电子订单系统升级步骤
  2. MySQL中where 1=1真的会影响性能么?
  3. Python爬虫:正则表达式?就这
  4. Ant批量打包工具的使用
  5. android简历!写给即将正在找工作的Android攻城狮,已拿offer
  6. Android Gatekeeper梳理
  7. Java最新面试题及答案
  8. 中国叉车行业发展现状及趋势分析,无人叉车将成为未来发展趋势「图」
  9. 火狐不能html转execl,使用Blob无法在FireFox中使用Excel导出JavaScript
  10. Project Management