Python程序设计及人工智能应用 课件 02 面向对象程序设计_第1页
Python程序设计及人工智能应用 课件 02 面向对象程序设计_第2页
Python程序设计及人工智能应用 课件 02 面向对象程序设计_第3页
Python程序设计及人工智能应用 课件 02 面向对象程序设计_第4页
Python程序设计及人工智能应用 课件 02 面向对象程序设计_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章面向对象程序设计面向对象的基本概念01类和对象类属性与实例属性方法020304构造函数与析构函数05多态性07类的继承0601面向对象的基本概念

为了解决大型软件设计危机,在20世纪80年代提出了面向对象程序设计(objectorientedprogramming,OOP)。面向对象程序设计是一种新的编程模式,这种编程模式的中心不再是程序的逻辑流程,而是软件或程序中的对象以及对象之间的关系。面向对象程序设计是针对大型软件的设计而提出的,它能使功能相对独立,能很好地做到代码重用,能使软件易于维护。01面向对象的基本概念抽象实例化抽象对象映射现实世界实体计算机世界类抽象数据类概念世界映射(1)对象对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。(2)对象的状态和行为对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。01面向对象的基本概念(3)类具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。01面向对象的基本概念(4)类的结构​在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。①一般--具体结构称为分类结构(继承关系),也可以说是“或”关系,或者是“isa”关系。01面向对象的基本概念(4)类的结构​在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。②整体--部分结构称为组装结构(组合关系),它们之间的关系是一种“与”关系,或者是“hasa”关系。01面向对象的基本概念01面向对象的基本概念三大特性封装把客观事物抽象并封装成对象继承允许使用现有类的功能,并在无需重新改写原来的类的情况下,对这些功能进行扩展多态性对象可以表示多个类型的能力02类和对象对象的创建和调用格式如下anObject=类名(参数列表)anObject.对象方法或anObject.对象属性class类名:

类体注意:(1)类使用关键字class声明,类名为有效的标识符(2)类体中可以定义属于类的属性、方法等(3)创建对象后,可访问其属性、调用其方法。(3)类---#定义学生类classStudent:def__init__(self,name):=name#初始化属性

defstudy(self):print(f"{}在学习...")#调用类zhangsan=Student("张三")zhangsan.study()#输出:张三在学习...01面向对象的基本概念02类和对象“万物皆对象”(Everythingisobject),这是python这种面向对象语言所倡导的理念。在C++中,1只是一个整型数,而不是一个对象。但在python中,1却是一个实实在在的对象,可以用dir(1)来显示它的属性。在python中,所有对象都有下面三个特征:*唯一的标识码(identity)*类型*内容(或称为值)一旦对象被创建,它的标识码就不允许更改。对象的标识码可以由内建函数id()获取,它是一个整型数。可以将它想象为该对象在内存中的地址,其实在目前的实现中标识码也就是该对象的内存地址。02类和对象46746200=0x02C94A581这个对象的标识码,也就是它在内存中的地址。>>>classc1:...pass...>>>obj=c1()>>>obj<__main__.c1instanceat0x02C94A58>>>>id(obj)46746200>>>id(1)4488231203类属性与实例属性Python对象的属性有实例属性和类属性 (1)实例属性 实例属性作为某个对象的属性,只为单独的特定的对象所拥有。一般有两种方式定义:方式一:实例属性不在类中,而在类外显示定义。方式二:类属性在类中的构造函数__init__中定义,定义时以self作为前缀。03类属性与实例属性classPeople:name='jack' #类属性name

p=People()p.age=12#实例属性age在类People之外定义print()#正确print(p.age)#正确print(P)#正确print(People.age)#错误03类属性与实例属性classPeople:name='jack'#__init__()是内置的构造方法,在实例化对象时自动调用

def__init__(self,age):self.age=agep=People(12)print()#正确print(p.age)#正确print(P)#正确print(People.age)#错误03类属性与实例属性(2)类属性 类属性是类本身的变量,又分为私有属性和公有属性。不像C++通过public和private关键字区别公有属性和私有属性,Python是以属性命名方式来区分,如果在属性名前面加了2个下划线'__',则表明该属性是私有属性,否则为公有属性。03类属性与实例属性classPeople:name='jack'#__init__()是内置的构造方法,在实例化对象时自动调用

def__init__(self,age,height):self.age=ageself.__height=heightp=People(12,110)print()#正确print(p.age)#正确print(p.__height)04方法实例方法类方法的第一个参数(self)通过对象实例调用类方法(@classmethod)属于类本身的方法静态方法(@staticmethod)与类的对象实例无关的方法04方法实例方法类方法的第一个参数(self)通过对象实例调用classDog:def__init__(self,name):=name#实例属性

defbark(self):#实例方法

print(f"{}汪汪!")#创建对象并调用实例方法dog1=Dog("旺财")dog1.bark()#输出:旺财汪汪!04方法类方法(@classmethod)属于类本身的方法classCar:brand="丰田"#类属性(所有汽车共享品牌)

@classmethoddefget_brand(cls):#类方法

returncls.brand#通过类名调用print(Car.get_brand())#输出:丰田#通过实例调用(不推荐)car1=Car()print(car1.get_brand())#输出:丰田04方法静态方法(@staticmethod)与类的对象实例无关的方法classCar:#类级别属性(所有实例共享)

DEFAULT_COLOR="黑色"

def__init__(self,brand):self.brand=brandself.color=Car.DEFAULT_COLOR#默认颜色

@staticmethoddefcalculate_mileage(distance,fuel):"""静态方法:计算里程数(公里/升)"""returndistance/fuel#使用示例car1=Car("丰田")#直接通过类名调用静态方法(不需要实例)mileage=Car.calculate_mileage(600,50)print(f"平均油耗:{mileage:.2f}公里/升")#输出:12.0004方法05构造函数classPerson:def__init__(self,name):=namedefsayHi(self):print('Hello,mynameis',)p=Person("zhou")p.sayHi()class

ClassName:

def

__init__(self,parameter1,parameter2,...):#初始化代码

self.attribute1=parameter1

self.attribute2=parameter2__init__

是Python的约定名称(不是关键字),必须包含

self

参数。每次创建实例时自动调用

__init__。05析构函数classCar:def__init__(self,n):self.num=nprint('numberis',self.num,'objectisborn...')def__del__(self):print('numberis',self.num,'objectisdead...')car1=Car(1)car2=Car(2)delcar1delcar206类的继承继承是为代码重用而设计的,当我们设计一个新类时,为了代码重用可以继承一个已设计好的类。在继承关系中,原来设计好的类称为父类,新设计的类称为子类。06类的继承派生类的声明class派生类名(基类1,[基类2,…]):类体声明派生类时,必须在其构造函数中调用基类的构造函数基类名.__init__(self,参数列表)06类的继承【例】继承的实现。classPerson(object):sex='male'def__init__(self,s1,s2):

self.IDcard=s1=s2

print('__init__(self)ofPerson')defhello(self,friend):

print('hello,',friend,'!

')06类的继承classStudent(Person):#子类Student,父类Persondef__init__(self,num):

self.number=num

deffun(self):

print(self.IDcard,,self.number,Student.sex)06类的继承classTeacher(Person):#子类Teachert,父类Persondef__init__(self,t,s1,s2):

self.title=tsuper(Teacher,self).__init__(s1,s2)

#调用父类的构造函数deffun(self):

print(self.IDcard,,self.title,

Teacher.sex)06类的继承#主程序stud1=Student('2012009')stud1.IDcard=='WangMing'stud1.fun()stud1.hello('Yang')teach1=Teacher('professor',,'YangLipin')Teacher.sex='female'teach1.fun()teach1.hello('Wang')07多态性方法重载方法重载实际上就是在子类中使用方法名与父类的方法名完全相同,从而重载父类的方法。如果仍需使用父类的该方法,需要在父类所生成的对象加‘.’方法名的形式调用。33class

BaseClass:

def

__init__(self):

=

"baseclass"

def

PrintName(self):

print(

+

":hello“)class

ChildClass(BaseClass):

def

PrintName(self):

BaseClass.PrintName(self)

print("Class2hello“)x

=

ChildClass()x.PrintName()[Dbg]>>>baseclass:helloClass2hello07多态性3407多态性classParent: defmyMethod(self):

print(

'Callingparentmethod')classChild(Parent): defmyMethod(self):

print('Callingchildmethod‘)c=Child()p=Parent()c.myMethod()#子类调用重载方法p.myMethod()#父类的方法输出:CallingchildmethodCallingparentmethod3507多态性运算符重载Python支持运算符重载。在C#中,运算符重载是通过使用关键字operator实现。Python的运算符重载方式较为简单,Python规定每一个类都默认内置了所有可能的运算符方法,只要重写这个方法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论