




免费预览已结束,剩余28页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6.Python类与对象,陈建文华中科技大学电子与信息工程系chenjw2014-04-10,20140410,6.Python类与对象,2,6.1类与对象定义6.2类与对象特点6.3类的构造函数6.4类与对象检查6.5面向对象模型6.6对象高级主题,6.Python类与对象,20140410,6.Python类与对象,3,6.1类与对象定义,面向过程与面向对象面向过程编程:根据操作数据的函数或语句块来设计程序的。面向对象编程:数据和功能结合起来,用称为对象的东西包裹起来组织程序的方法;在大多数时候你可以使用面向过程编程,但是有些时候当需要编写大型程序或是寻求一个更加合适的解决方案的时候,就需要面向对象的编程,Python既可以提供面向过程的编程,也可以面向对象的编程,归根到底,Python语言是面向对象的编程语言。,20140410,6.Python类与对象,4,类与对象示例,classBird():def_init_(self):self.hungry=Truedefeat(self):ifself.hungry:print(Aaaah.)self.hungry=Falseelse:print(No,thanks!),b1=Bird()b1.eat()Aaaah.b1.eat()No,thanks!b1.eat()No,thanks!b1.hungryFalseb1.hungryFalse,20140410,6.Python类与对象,5,类和对象是面向对象编程的两个主要方面,类创建一个新类型,而对象是这个类的实例。这类似于上面一个类Bird(),而b1是类Bird的一个实例,也就是类的一个对象(实例)。类的组成元素:关键字(类):class类的名字:Bird构造函数:_init_(self)类的方法:eat(self)(b1.eat()类的特性:hungry(b1.hungry),20140410,6.Python类与对象,6,类与对象格式类的组成:,classClass_Name(SuperClass,):class_variable=valuedef_init_(self,argv):statementdefclass_func(self,argv):statement,关键字(类):class类的名字:Class_name构造函数:_init_(self,argv)类的方法:class_func(self,argv)类的特性:class_variable,20140410,6.Python类与对象,7,对象定义,class_object_1=Class_Name()class_object_2=Class_Name()class_object_1.class_variableclass_object_2.class_variableclass_object_1.class_func(argv)class_object_2.class_func(argv),对象定义:class_object_1=Class_Name()对象特性:class_object_1.class_variable对象方法:class_object_1.class_func(argv),20140410,6.Python类与对象,8,6.2类与对象特点,类与对象特性对象可以使用普通的属于对象的变量存储数据,属于一个对象或类的变量被称为特性;对象也可以使用属于类的函数具有的功能;这样的函数被称为类的方法。这些术语帮助我们把它们与孤立的函数和变量区分开来;特性和方法可以合称为类的属性。特性有两种类型:属于每个实例/类的对象或者属于类本身,它们分别被称为实例变量和类变量。类使用class关键字创建,类的特性和方法被列在一个缩进块中。,20140410,6.Python类与对象,9,与类和对象的名称空间绑定的普通变量,即这些名称只在这些类与对象的前提下有效。类名.类变量(使用对象名.类变量也可访问);对象名.对象变量。命名空间定义的位置:类特性:紧跟在类定义之后;对象特性:在_init_中使用self.xxx=定义。例子:,classvar():value=1instance1=var()var.valueinstance1.value,20140410,6.Python类与对象,10,类与对象方法类的方法与普通的函数只有一个特别的区别:类的方法必须有一个额外的第一个参数名称self,但是在调用这个方法的时候你不必为这个参数赋值,Python会提供这个值,这个特别的变量指的是对象本身,按照惯例它的名称就是在类定义中常见的self这个变量名。可以是任意一个变量名,但最好遵循通用的规则;Self这个变量名具有一定的魔法,在具体的对象中它有特定的意义。,20140410,6.Python类与对象,11,Self参数的工作原理:假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1,arg2)的时候,这会由Python自动转为MyClass.method(MyObject,arg1,arg2),这就是self的使用原理。如果你有一个不需要参数的方法,你还是得给这个方法定义一个带有self参数。类与对象方法的使用:调用方法同普通函数一致,忽略self参数。对象名.方法名(参数),20140410,6.Python类与对象,12,classBird:def_init_(self):self.hungry=Truedefeat(self):ifself.hungry:print(Aaaah.)self.hungry=Falseelse:print(No,thanks!),b=Bird()b.hungryTrueb.eat()Aaaah.b.eat()No,thanks!b.eat()No,thanks!,20140410,6.Python类与对象,13,类与对象的魔法:(详见对象高级主题)_init_构造函数;_del_析构函数;_len_,_getitem_,_setitem_,_delitem_这是系列映射规则;_privatename私有类的变量名;decorators装饰器;_iter_迭代器;,20140410,6.Python类与对象,14,类与对象多态Polymorphism:术语多态来自于希腊语,多态意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而且它也能根据(或者类)对象的类型的不同而表现出不同的行为。例如:,classvar():value=1instamce1=var()var.valuePythoninstance1.value55,defadd1(x,y):returnx+yx=1,y=23x=“spam”,y=Pythonadd1(x,y),20140410,6.Python类与对象,15,类与对象封装Encapsulation:封装是对外部隐藏对象内部细节的原则,看起来有点象多态,但封装并不等于多态;多态可以让用户对于不知道是什么类或者对象类型的对象进行方法调用;而封装是可以不用关心对象是如何构建的而直接进行使用。例如:,classvar():value=1instance1=var()instance2=var()instance1.value=Pythoninstance2.value=55,20140410,6.Python类与对象,16,类与对象继承Inheritance:以普通类为基础建立专门的类对象;如果已经有一个基类,想再建立一个新类,新类中要添加几种新方法,而又要用原来基类的一些方法,这个时候新类就要继承基类的方法,而又有新的方法,这就是继承;继承的方法就是在新类定义中添加一个基类作为参数。例如:,classSongBird(Bird):def_init_(self):self.sound=Squawkdefsing(self):print(self.sound),20140410,6.Python类与对象,17,6.3类的构造函数,类的构造函数定义类的构造函数的形式为:def_init_(self):superclass._init_(self)#未绑定超类super(subclass,self)._init_()#调用super()statement类的构造函数与其它普通方法不同的地方在于,当一个对象被创建后,会立即调用构造方法,就有点类似于程序中的init的初始化方法。如果要继承构造方法,可以调用未绑定的超类构造方法,也可以用super函数调用超类构造函数。,20140410,6.Python类与对象,18,类的构造函数继承,classBird:def_init_(self):self.hungry=Truedefeat(self):ifself.hungry:print(Aaaah.)self.hungry=Falseelse:print(No,thanks!),classSongBird(Bird):def_init_(self):super(SongBird,self)._init_()self.sound=Squawkdefsing(self):print(self.sound),20140410,6.Python类与对象,19,6.4类与对象的检查,Callable(object):检查对象是否可调用。hasattr(object,method):检查给定的对象是否有指定的属性。getattr(object,name):返回给定对象中所指定的特征的值,可选择给定默认值。issubclass(subclass,superclass):检查subclass是否是superclass的子类(每个类都是自身的子类)。isinstance(object,class):检查给定的对象object是否是给定的class类的实例。,20140410,6.Python类与对象,20,6.5面向对象模型,面向对象模型建立草图:写下问题的描述(程序要做什么?)把所有动词、名词、形容词加下划线;对于所有名词,用作可能的类;对于所有动词,用作可能的方法;对于所有形容词,用作可能的特性;对所有方法与特性分配到类。建立类与实例模型:写下一系列使用实例;一步一步考虑每个使用实例,保证模型包含所有需要的东西。,20140410,6.Python类与对象,21,6.6对象高级主题,构造方法构造方法不同于其它方法之处在于:当一个对象被创建时,会立即调用构造方法,而且可以继承。,classBird:def_init_(self):self.hungry=Truedefeat(self):ifself.hungry:print(Aaaah.)self.hungry=Falseelse:print(No,thanks!),classSongBird(Bird):def_init_(self):super(SongBird,self)._init_()self.sound=Squawkdefsing(self):print(self.sound),20140410,6.Python类与对象,22,成员访问利用_getitem_,_setitem_,等魔法可以实现简单序列。,defcheckIndex(key):ifnotisinstance(key,(int,float):raiseTypeErrorifkeys=ArithmeticSequence(1,2)s49s4=3s43s613,20140410,6.Python类与对象,23,迭代器定义一个类;classclass_name:定义类中有二个方法:_next_(self)_iter_(self)如普通类一样使用迭代器,重复做一件事很多次。,classTestIterator():value=0def_next_(self):self.value+=1ifself.value10:raiseStopIterationreturnself.valuedef_iter_(self):returnself,ti=TestIterator()list(ti)1,2,3,4,5,6,7,8,9,10,20140410,6.Python类与对象,24,defflatten(nested):try:forsublistinnested:forelementinflatten(sublist):yieldelementexceptTypeError:yieldnested,s=1,2,3,4,5,1,2,1,2,3,1,2list(flatten(s)1,2,3,4,5,1,2,1,2,3,1,2foriinflatten(s):.print(%2d%i,end=).123451212312,这是一个展开嵌套列表的带有关键字yield的函数,Helpyield,生成器生成器是Python新引入的概念,是一种用普通的函数定义的迭代器。,20140410,6.Python类与对象,25,属性利用property函数的四个参数,可以实现模拟访问器方法。,classRectangle():def_init_(self):self.width=0self.height=0defsetSize(self,size):self.width,self.height=sizedefgetSize(self):returnself.width,self.heightsize=property(getSize,setSize),r=Rectangle()r.height0r.width0r.width=10r.height=5r.size(10,5)r.size=150,100r.size(150,100)r.height100r.width150,20140410,6.Python类与对象,26,classMyclass():staticmethoddefsmeth():print(Thisisastaticmethod)classmethoddefcmeth(self):print(Thisisaclassmethodof,self),Myclass.smeth()ThisisastaticmethodMyclass.cmeth()Thisisaclassmethodof,类装饰器类装饰器是一个函数,它接受类作为输入并返回类作为输出。,20140410,6.Python类与对象,27,经典问题:八皇后问题。要求分析:八皇后放在8x8的方格里;互相不能在同一行和同一列;互相不能在对角线上。,20140410,6.Python类与对象,28,defconflict(state,nextX):nextY=len(state)foriinrange(nextY):ifabs(statei-nextX)in(0,nextY-i):returnTruereturnFalse,寻找冲突已知皇后的位置传递给函数conflict,然后用函数判断下一个皇后的位置有没有冲突。其中nextX是下一个皇后的水平位置,nextY是垂直位置。如果与前一个皇后的水平位置之差为零(在同一列)或者等于与前一个垂直位置之差(在同一个对角线)就冲突,否则就没有冲突。,20140410,6.Python类与对象,29,defqueens(num=8,state=():iflen(state)=num-1:forposinrange(num):ifnotconflict(state,pos):yield(pos,),基本情况从基本情况开始。用语言描述就是:如果只剩最后一个皇后没有放置,那么遍历她的所有可能的位置,并且返回与前面没有发生冲突的位置。num是皇后的总数,state是存放前面皇后的位置信息的元组,conflict是前面介绍的冲突函数。,20140410,6.Python类与对象,30,需要递归从前面的皇后得到包含位置信息的元组,并且要为后面的皇后提供当前皇后的每种合法的位置信息。为了让程序继续下去,接下来就需要把当前的位置信息添加到位置元组中并传给后面的皇后。,defqueens(num=8,state=():forposinrange(num):ifnotconflict(state,pos):iflen(state)=num-1:yield(pos,)else:forresultinq
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家乐福采购管理制度
- 家庭高血压管理制度
- 应急备品库管理制度
- 形象岗岗位管理制度
- 影视部策划管理制度
- 微电影拍摄管理制度
- 快递员车辆管理制度
- 急诊抢救室管理制度
- 总监办生活管理制度
- 患者输液室管理制度
- 信息化项目网络设备、网络安全设备、服务器和存储系统集成项目培训方案
- 汉语语法教学-是……的
- 2009-2022历年河北省公安厅高速交警总队招聘考试真题含答案2022-2023上岸必备带详解版4
- 无犯罪记录无吸毒史证明模板
- 六年级信息技术下册《走进人工智能》优质课获奖课件
- 第18课 现代设计与现代媒体-高中美术鲁美版美术鉴赏
- 国际商务毕业论文范文
- 劳动法课件(完整版)
- GB∕T 37456-2019 海洋平台电驱动齿轮齿条升降装置
- 营运车辆智能视频监控系统管理制度范本及动态监控管理制度
- DB34∕T 3587-2020 城镇排水管道检测与修复技术规程
评论
0/150
提交评论