本来想把第十章和第十一章分开的,但是学完第十一章发现,没有什么特殊,主要是练习,因此,第十一章就没有做笔记,但是小伙伴们一定要自己敲一遍哈~
第十章:面向对象编程
知识点:
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版》就这么猝不及防的结束了,下面我们要开始艰难之旅咯~加油~
领取专属 10元无门槛券
私享最新 技术干货