python3 :习题40、习题41
习题40:模块、类和对象
这一节一下就变得好抽象啊,看的脑阔痛。
模块和字典差不多
假设有个字典,它里面有一个叫’apple’的键(key),而你要从中取值(value)的话,你需要:
而对模块,我们应该已经了解的属性:
- 模块是包含函数和变量的python文件。
- 可以导入这个文件。
- 然后可以使用 . 操作符访问模块中的函数和变量。
假设我有模块叫mystuff.py,并在里面放一个Apple的函数
接下来就可用import来调用这个模块,并访问Apple函数。
同样的,可以将变量放进模块里,并访问它。
故,python里有一个非常常用的模式:
- 拿一个类似“键=值”风格的容器;
- 通过“键”的名称获取其中的“值”。
对字典来说,获得值的方法是“[key]”,对于模块来说,语法是“.key".除此之外,它们基本没什么不同。
类和模块差不多
因此可以将模块当做一种专用的字典,可以通过它储存一些python代码,并访问它。而python还有“类”来实现类似目的。通过“类”,可以把一组函数和数据放到一个容器中,从而用“ . "运算符访问它们。
创建一个类的方法大致是:
使用类而不是模块的原因是:你可以那上面的mystuff类重复创建很多出来。而对于模块来说,一次导入之后,整个程序中就只有这一份内容,那该如何用mystuff达到类似mystuff.py 模块的结果?
对象和import差不多
如果说类和迷你模块差不多,那么对类来说,也必有一个类似导入(import)的概念。这个概念就叫做“实例化”(instantiate),它的意思其实是“创建”。而当你将一个雷实例化后,得到的就叫对象(object)。
将类实例化(创建类)的方法就是像调用函数一样调用一个类。
第一行代码即为“实例化”操作,和调用函数很类似。python在你实例化操作背后的一系列逻辑为:
- python查找mystuff()并知道了它是你定义过的一个类。
- python创建了一个空对象,里面包含了你在该类中使用def指定的所有函数。
- 然后python回去检查你是不是在里面创建了一个_init_函数,如果有创建,就会调用这个函数,从而对你新创建的空对象实现了初始化。
- 在mystuff的_int_函数里,有一个多余的函数叫self,这就是python为你创建的空对象而你可以对它进行类似模块、字典等的操作,为它设置一些变量。
- 在这里,zed把self.tangerine设为一段歌词,这样就初始化了对象。
- 最后python将这个新建的对象赋给一个叫thing的变量,以供后面使用。
这个导入过程中,并不是直接拿来一个类就直接用,而是将类作为一个“蓝图”,然后用它创建和这个类有相同属性的副本。
不幸的是,又出现了错误,更不幸的是,我现在还不知道为啥错了,和书上一模一样不是么。
获取某样东西里包含的东西
现在有3种方法可以从某个东西中获取东西。
- 字典式:mystuff[‘apple’]
- 模块式:mystuff.apple() print(mystuff.tangerine)
- 类式: thing=mystuff() thing.apple() print(thing.tangerine)
- 今日份编程(有错误):
- 错误信息:(不知道怎么解决)
习题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。
在上述的每一条当中,你看到X,Y,M,J,K,Q,和foo的地方都可以将他们当做空白点来对待。
混合巩固练习
阅读测试:
这段代码据作者zed所说“很简单,你应该能看懂“在下试了试。emmmm。。肯定是我的水平还不够,在求助各种方法后,尽量注释了这段代码的前半部分,并试着运行了下
至少运行还成功得,这还是在参考了网上的结果的情况下: