首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

AI转行之Python学习(七):第十章、第十一章

本来想把第十章和第十一章分开的,但是学完第十一章发现,没有什么特殊,主要是练习,因此,第十一章就没有做笔记,但是小伙伴们一定要自己敲一遍哈~

第十章:面向对象编程

知识点:

1、面向对象编程(简称OOP)。OOP是一种组织程序的方法,提倡仔细设计和代码重用。

2、本质上说,对象是一组数据以及操作这些数据的函数。

3、创建新型对象,必须先创建类。类就是设计蓝图,用于创建特定类型的对象。类指定了对象将包含哪些数据和函数,还指定了对象与其他类的关系。对象封装了数据以及操作这些数据的函数

4、继承:创建新类时,可让它继承既有类的数据和函数

例1:

解析:

1、定义了一个名为Person的类。并定义了Person对象包含的数据和函数

2、__init__是唯一的一个函数,用于初始化对象值的标准函数

3、创建Person对象时,Python将自动调用__init__

在类中定义的函数被称为方法。与__init__一样,方法的第一个参数必须是self

在有些OOP语言中,__init__被称为构造函数,因为它构造对象。每次创建新对象时,都将调用构造函数。在Java和c++语言中,创建对象时需要使用关键字new

例2:

解析:

1、在调用Person()时没有提供任何参数,但函数__init__(self)期望获得名为self的输入。这是因为在OOP中,self是一个指向对象本身的变量Java和C++等其他一些语言要求必须使用名称this

2、书上print中的Person是Person(‘%s’,age),但是这样运行时会报错,原因还不知道。但是将age换成'%s'就是正常的了

例3:

例4:

例5:

解析:

1、特殊方法__repr__,返回对象的“官方”表示,当没有这个方法时。Person对象的默认官方表示并不实用。

2、通过添加方法__repr__我们可控制这里打印的字符串

知识点:

1、创建自己的类和对象时,编写函数__str __和__repr__几乎总是值得的。它们对于显示对象的内容很有帮助,而显示对象的内容有助于调试程序

2、如果你定义了方法__repr__,但是没有定义方法__str__,则对对象调用str()时,将执行__repr__

3、添加方法__repr__后,可进一步简化方法display:

def display(self):

print(self)

实际上,通常没有必要编写方法display

例6:

构造对象时,将姓名和年龄传递给__init__

解析:

变量name指向传入__init__的值,而self.name指向存储在对象中的值

注:空的Person对象没有真正意义上的姓名和年龄,因此需要在处理Person对象的代码中检查这一点。始终需要检查特殊情形很快会成为负担,而且容易忘记。所以很多人不会这样给__init__的参数指定默认值

例7:

解析:对于这种设置函数,一种常见的抱怨是,输入p.set_age(30) 比输入p.age=30更繁琐。为解决这种问题,可使用特性装饰器(property decorator)

知识点:

1、装饰器是Python中的一种通用结构,用于系统地修改既有函数。装饰器通常放在函数开头,并以@字符打头

2、特性装饰器变量的简洁与函数的灵活于一身。装饰器指出函数或方法有点特殊。这里使用它们来指示设置函数和获取函数

3、获取函数返回变量的值,我们将使用@property装饰器来指出这一点

例8:

解析:@property是用来获取函数返回变量的值。这个 age方法除必不可少的self外不接受任何参数。我们在它前面加上了@property,指出这是一个获取函数。这个方法的名称将被用于设置变量。

例9:

解析:由于给age提供了设置函数和获取函数,编写的代码就像直接使用变量age,但差别在于:遇到代码p.age=-4时,Python实际上将调用方法

age(self,age);同样,遇到代码p.age时,将调用方法age(self)。这提供了一点:赋值语法很简单,同时可控制变量的设置和获取方式

例10:

解析:直接访问self._age,发现是允许的。这个问题在于,直接修改_age可能导致对象不一致,因此通常不希望直接修改的情况发生

为降低变量self._age被直接修改的可能性,一种方式是将其重新命名为self.__age,即在变量名开头包含两个下划线两个下划线表明age是私有变量,不应在Person类外直接访问它要直接访问self.__age,需要在前面加上_Person,如下图:

解析:这虽然不能禁止直接修改内部变量,但将无意间这样做的可能性几乎降到了零

知识点:

1、不以下划线打头的变量是公有变量,任何代码都可访问他们

2、编写大型程序时,首先将所有对象变量都设置成私有的(即以两个下划线打头),再在有充分理由的情况下将其改为公有

3、不提供设置函数,让对象是不可变的,可避免众多微妙的错误,并让不同的变量共享同一个对象,从而节省内存。缺点是如果需要修改对象,唯一的选择是创建一个体现了变更的新对象

4、如果将age设置为指定范围外的值,age(self,age)什么都不会做。另一种方法时故意引发一场,要求设置age的代码必须处理这种异常。引发异常的优点在于,有助于发现其他错误

例11:

例12:

有一个小瑕疵是,h的字符串表示为Player

例13:

这就是方法重写:Human中的方法__repr__重写了从Player那里继承的方法__repr__

基类常被称为父类,而派生类常被称为子类

遗憾的是,多态小节中的Undercut小游戏总是出错,还没有找到原因,待伊菲再研究研究看看

第十一章案例研究:文本统计

这一章节主要是通过案例来加深对Python的理解和应用,伊菲没有做笔记,小伙伴们自己有也一定要敲一遍哈~

《Python编程入门第3版》就这么猝不及防的结束了,下面我们要开始艰难之旅咯~加油~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180301G0A0DD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券