计算科学基础_8_CHEN
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算科学基础(第8讲)——Python的类和继承
陈奇
地理与信息工程学院
实现类使用类◼从两个不同的角度编写代码
使用类实现新的对象类型•定义数据属性,也即:对象是什么?
•定义方法,也即:怎样使用这个类?在代码中使用新的对象类型•创建对象类型的实例
•对这些实例进行运算
对象类型的类定义类的实例
◼类名称是类型
class Coordinate ( object )
◼类的一般定义
•在定义类时self用于指定具有该类型的任意一个实例
( self . x–self . y) ** 2
•类定义时,self是方法的一个参数
◼类定义的数据和方法对于所有实例通用◼实例是一个特定的对象
coord= Coordinate ( 1 , 2 )◼数据属性值在实例之间变化
C1=Coordinate(1 , 2 )
C2 =Coordinate(3 , 4 )
•C1和C2具有相同类型,但是是两个不同的对象,他们具有不同的数据属
性值; 如:C1 . x 和C2 . x
◼实例具有类的结构
为什么要使用OOP 和类(class)
◼模拟现实世界生活
◼将同一种类的多个对象分为一组
1岁白色
5个月白色+黄棕色
3个月灰色
1岁黄棕色
2岁棕色0岁黑色
1岁黄棕色2岁棕色
豆豆1岁白色小米5个月白色+黄棕色小乖3个月灰色
对象组具有的属性
◼数据属性
•如何用数据表示对象?
•是什么?
•对于一个坐标,那么其数据属性有x 和y 值,如:Coordinate
•对于一个动物,那么其数据属性包括:年龄,姓名,毛色,如:Animal ◼过程属性(也即:行为/操作/方法)
•如何与对象(同类对象或其他类对象)交互?
•做什么?
•对于坐标:可以计算两个坐标之间的距离
•对于动物:发出声音
8.1.1 getter和setter 方法
◼getters 和setters 应该在类外用于访问数据属性
8.1.2 信息隐藏
◼类定义过程中可以“更改”数据属性变量名(变量名与形参名不必相同)将形参age 的值赋值给变量years
◼如果我们正在访问类和类定义更改之外的数据属性,可能会得到错误
◼因此,类外数据访问,使用getters 和setters (即使用a . get _ age () 而不是a . age )•良好的编程风格•易于维护代码
•预防程序出错
在Python3中,可以使用命名惯例使属性在类之外不可见。
当一个属性的名称以__ 开头,但不以__ 结束时,这个属性在类外就是不可见的
Python 不擅长信息隐藏
◼允许从类定义外部访问数据
◼允许从类定义外部写入数据
◼允许从类定义外部为实例创建新的
数据属性
8.1.3类变量
默认参数
◼如果没有给出实际参数,则使用形式参数的默认参数
◼这里使用的默认参数,如:
◼这里使用传入的参数,如:
输出“”
输出“fluffy”
8.2 继承
◼不同的类型(类)中有许多通用的属性。
例如:list 类型和str类型都具有len 函数,意义也完全一样
◼继承提供了一种方便的机制,可以建立一组彼此相关的对象。
它使程序员能够建立一个类的层次结构,其中每个类型都可以从上层的类继承属性
◼在Python中,一切都是对象,因此Object类在最顶层
--people
分层
◼父类(parent class )也叫超类(superclass )
◼子类(child class )
子类(subclass )
•继承父类的所有数据和行为
•添加新的属性,例如:子类中新增变量•添加新的行为,例如:子类中新增方法
•重载–也就是替换—父类中的属性,如果一个方法被重载,那么调用这个方法时使用的版本就要根据调用这个方法的对象来确定。
如果这个对象的类型是子类,那么就使用定义在子类中的方法版本;如果对象的类型是父类,那就使用父类中的版本
动物--Animal
人--Person 猫--Cat 兔子--Rabbit 学生–student
使用哪一种方法?
◼子类(subclass)可以具有与父类同名的方法
◼对于类的实例,首先在当前类定义中查找方法名
◼如果没有找到对应的方法名,将在层次结构中查找方法名,如:先在父类(parent)中查找,然后再往上从祖父类(grandparent)查找等◼将使用在从下层往上层的查找过程中找到的第一个方法
父类是Animal
调用Animal 初始化函数
调用Animal 的方法
新方法
重载Animal 中的__str__ 方法
从random类中引用方法
继承Person和Animal 的属性
增加新数据
random ()方法返回从[0, 1) 的浮点数
zfill函数可使用0将字符串补充至指定长度。
例如:‘1’.zfill(3) = ‘001’
a
专门为Rabbit类设计的getter 方法,此外,
Rabbit类还从Animal 继承了其他getter
包括:get_name, get_age
应用我们自己定义的Rabbit类
回忆:Rabbit’s__init__ ( self, age, parent1 = None, parent2 = None)
◼在两个Rabbit实例之间定义+ 运算符
•只有定义__add__函数后,两个Rabbit实例的+运算才有意义(如:r4 = r1 + r2)•r4 是一个年龄为0 的新Rabbit 实例
•r4 将self 作为parent1,other 作为parent2
•在__init__函数中, parent1 和parent2 都是Rabbit 类型
设计特设方法对Rabbit类的实例进行比较
◼如果两只兔子有相同的双亲,则判断它们是相等的
布尔运算
◼比较父类的id,因为id是唯一的(考虑到类变量的存在)
◼注意:不能直接比较对象
•例如:self.parent1==other . parent1
•会造成一次又一次地调用__eq__ 方法,直到它被None调用,并在尝试执行None.parent1 时导致异常AttributeError
面向对象编程OOP
◼创建自己的数据集合(层次结构)
◼组织信息
◼分治思想
◼采用一致的方式访问信息
◼对复杂关系进行层次化管理
◼与函数一样,类也是在编程中应用分解和抽象思想的一种有效手段
Thanks.。