# 练习41.学会说面向对象

在这个练习中,我要教你如何说“面向对象”,我要给你一些你需要知道定义的词。然后我会给你一组你必须了解的句子,最后我会给你一大堆练习,你必须完成这练习题,将我给你的句子转化成自己的词汇。

## 单词解释

class(类):告诉python去创建一个新类型。object(对象):有两种意思,事物的基本类型,或者事物的实例化。instance(实例):你通过python创建一个类所获得的。def:用来在类中定义一个函数。self:在一个类包含的函数中,self是一个用来访问实例或对象的变量。inheritance:概念,表示一个类可以继承另一个类的特征,就像你和你的父母。composition:概念,表示一个类可以包含其他类,就像汽车轮子。 attribute:类所拥有的特性,通常是变量。is-a:惯用语,表示一个东西继承自另一个东西(a),像在“鲑鱼”是“鱼”。 has-a:惯用语,表示由其他事情或有一个特征(a),如“鲑鱼有嘴。”

花一些时间制作一些卡片用来记忆这些术语。像往常一样,直到你完成这个练习后,这都不会有太多的意义,但是首先你需要知道的基本词汇。

## 短语解释

接下来,在左边有一个Python代码片段列表,右面是他们的解释`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。

你可以把上面看到的所有的X, Y, M, J, K, Q, 以及 foo 看做空白的坑,比如,我还可以这么写:

> 1. 创建一个叫??的类继承Y

> 1. 类??有一个`__init__`方法,该方法有self和??两个参数。

> 1. 类??有一个叫??的函数,该函数有self和??两个参数。

> 1. 给foo赋值为类??的一个实例。

> 1. 从foo里调用??函数,传递的参数为self和??。

> 1. 从foo里调用??属性,并将其设置为??。

同样的,把这些写到卡片上,牢牢记住它们。卡片的前面写上python的小段代码,背面写上它们的解释,你要做到每当你看到正面的代码段的时候,能立即说出后面的解释。

## 组合练习

最后给你准备的是将单词和短语结合起来练习。我希望你能做到下面的要求:

> 1. 准备好短语的卡片,并拼命的练习

> 1. 翻转卡片,阅读这些解释语句,挑选出语句中包含单词练习中单词的卡片

> 1. 通过这些语句拼命练习这些单词

> 1. 坚持练习,直到你厌烦了,休息一下,然后继续练习

## 阅读测试

下面有一个python脚本,这个脚本会以无尽模式训练你,检验你所掌握的这些单词。这是一个很简单的脚本,它实现的功能是使用了一个叫做`urllib`的类库来下载我提供的单词列表。下面就是这个脚本,你需要正确的输入并命名为`oop_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 '***'."

}

# do they want to drill phrases first

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

PHRASE_FIRST = True

else:

PHRASE_FIRST = False

# load up the words from the website

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

# keep going until they hit CTRL-D

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"

~~~

运行这个脚本,尝试将这些“面向对象的短语”翻译成自己的语言。你应该能看到字典`PHRASES`中包含了刚才练习的所有的短语。

## 练习将英语转换为代码

接下来,你可以使用"english"选项来执行脚本,这样你可以反过来练习:

~~~

$ python oop_test.py english

~~~

记住这些短语使用的是无意义的词汇。学习阅读代码的一部分是停止纠结这些用于变量和类的名字的真实意义。人们常常会在读到一个像“cork”的词时突然迷糊,因为这个词会混淆他们的意义。在这个例子中,"Cork"只是用来作为一个类的名字。不要给它任何意义的解释。

## 的代码

你现在需要继续的代码,阅读你找到的代码中这些你刚学过的短语表达。你需要找出文件中所有的类,然后执行以下步骤:

> 1. 给出每一个类的名字,并说出这些类继承哪些类

> 1. 列出每个类所包含的函数,以及函数需要的参数

> 1. 列出类所有的属性

> 1. 对每个属性,给出属性的类型

这个练习的目的是通过阅读真实的代码,学习你刚才学到的短语是如何使用的。如果你练习的足够所,你应该能看到这些模式在代码中向你大声呼喊,然而在这之前,他们是你所不知道的,只是模糊的空白而已。

## 常见问题

### Q: 这句代码`result = sentence[:]`实现了什么

> 这是python中用来复制列表的一种方式。你使用了列表的分割切片语法`[:]`,得到列表从第一个到最后一个元素的切片。

### Q: 这个脚本很难跑起来啊

> 你需要输入这些代码并保证它能运行。这个脚本可能会有一些小问题,但是它并不复杂。试着用你到目前为止学到的东西来调试脚本,每输入一行,确认一下是否与我的代码一样,并在网上搜索你所不了解的所有问题。

### Q: 这对我来说太难了!

> 你可以的,慢慢来,如果需要的话,你逐个字符的输入,然后弄明白它是做什么的。

笨办法学python47 原理_41:学会说面向对象相关推荐

  1. 笨办法学python47详解_练习 47 - 自动化测试 - 笨办法学Python3

    练习 47. 自动化测试 为了确认游戏功能是否正常,你需要一遍一遍地在你的游戏中输入命令.这个过程非常枯燥.如果能写一小段代码来测试你的代码岂不是更好?一旦你对程序做了任何修改,或者添加了什么新东西, ...

  2. 《笨办法学python3》再笨的人都能学会python,附PDF,拿走不谢

    <笨办法学python3>这本书的最终目标是让你起步python编程,虽然说是用"笨办法"学习写程序,但是其实并不是这样的. 所谓的"笨办法"就是指 ...

  3. 笨办法学python3_月底送书!入门Python都在学的“笨办法”,出进阶篇了!

    你们知道吗?每10个将Python作为自己的入门语言的程序员里,就有8个是读着<"笨办法"学Python>的书成长的!这位拥有近20年的编程和写作经验的IT书籍作家-- ...

  4. 物联网课程学习目标_【笨办法学物联网】之一: 物联网工程专业四年里应该学习哪些实用技能傍身?...

    我列举一些我认为物联网工程专业毕业生应该具备的基本功. 你只需要花费5000元,同时投入一定的时间,就可以相比你的同学,大大提高理论水平和动手能力. 这些内容大四出去实习前最好能都入门,同时相对比较深 ...

  5. 笨办法学python3在线阅读知乎_Python第三课——笨办法学Python

    需要学习资料的请直接看文末 <笨办法学Python>(Learn Python The Hard Way,简称LPTHW)是Zed Shaw编写的一本Python入门书籍.适合对计算机了解 ...

  6. 笨办法学Python 经典Python入门书籍介绍

    本文小编将和大家介绍一本经典Python入门书籍--<"笨办法"学Python>.当然本书作者Zed Shaw说的笨办法,并不是真的用很蠢笨的方式去学Python,而是 ...

  7. 计算机编程书籍-笨办法学Python 3:基础篇+进阶篇

    编辑推荐: 适读人群 :本书适合所有已经开始使用Python的技术人员,包括初级开发人员和已经升级到Python 3.6版本以上的经验丰富的Python程序员. "笨办法学"系列, ...

  8. python教程第四版pdf下载-笨办法学python第四版

    笨办法学python第四版是由Zed Shaw所编写的一本书.如果你还是Python新手,那么这是一本非常不错的入门书籍.书本里以习题方式,引导读者慢慢学会了编程. 目录: 习题 0: 准备工作 习题 ...

  9. python教程第四版pdf下载-笨办法学python第四版 电子书(pdf格式)

    笨办法学python第四版是由Zed Shaw所编写的一本书.如果你还是Python新手,那么这是一本非常不错的入门书籍.书本里以习题方式,引导读者慢慢学会了编程. 目录: 习题 0: 准备工作 习题 ...

最新文章

  1. c 普通的文本变成注释文本的快捷键_2019年IntelliJ IDEA快捷键终极大全,绝版!速度收藏!...
  2. 2021年3月19日 百度开发实习面试(质量效能研发部)(一面)
  3. 2021年吴文俊人工智能科学技术奖获奖名单公示!潘云鹤院士获最高成就奖
  4. 这里有一张中国的数字化地图,请查收
  5. 电脑启动后,没有桌面
  6. 【系统分析与设计】UML协作图绘制方法(真の能看懂~!)
  7. java 数据结构源码--Trie树
  8. android 自定义频谱,android – 如何从实时音频开发频谱分析仪?
  9. java 日期只计算年月日大小_Java 计算两个日期相差多少年月日
  10. 信贷风控必知必会:逾期相关的知识点总结
  11. C#根据屏幕尺寸大小重新定位控件大小和位置
  12. 【原创】实战padding oracle漏洞
  13. 大学数学新生入门学习数学方法导引 by Ph.D.王小龙
  14. CSDN优质博主推荐(C/C++领域)-持续更新中
  15. Jzoj5605 Zkb
  16. ”latest”(已经确认了的), “earliest”(创世区块的) , “pending”(包含未确认的交易的余额)
  17. SOCKET实现广播(BoardCast)的发送和接收 (转)
  18. 人工神经网络 人工智能,人工智能神经网络技术
  19. 基于L0边缘保持滤波的图像融合 matlab代码
  20. 4-2毕达哥拉斯三元组

热门文章

  1. 一句话反弹shell
  2. python3 asyncio 协程模块
  3. python3 环境变量
  4. 开源杀毒引擎 ClamAV
  5. iconv 文件编码转换
  6. 编程之美2.1 求二进制中1的个数
  7. QEMU虚拟网卡设备的创建流程
  8. linux系统调用挂钩方法总结
  9. php自定义扩展函数,Laravel框架中扩展函数、扩展自定义类的方法
  10. leetcode287. Find the Duplicate Number