版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章面向对象编程7.5继承7.4封装7.2属性和方法7.6多态7.3构造方法和析构方法7.1类和对象7.7案例实战7.1类和对象7.1类和对象
面向对象编程(OOP)是一种编程方式,此编程方式的需要使用“类”和“对象”来实现,所以,面向对象编程实质就是对“类”和“对象”的使用。
类:就是一个模板,模板里可以包含多个方法和属性。
对象:根据模板创建的实例,通过实例对象可以执行类中的方法。7.1类和对象7.1.1类的定义类由三部分组成:类名:类的名称,它的首字母一般大写。属性:用于描述类的特征,也称为数据成员。例如:人有姓名、年龄等。方法:用于描述类的行为,也称为方法成员。例如:人具有运动、说话等行为。类的定义语法如下:class
<类名>():
<类的属性> <类的方法>7.1类和对象7.1.2创建对象创建好了类之后,就可以创建实例对象了。创建对象的语法格式如下:对象名=类名()Python中可以动态为类和对象添加成员,这一点和很多面向对象程序设计语言不同。要想给对象添加属性,可以通过如下方式:对象名.新的属性名=值7.1类和对象classPerson(): #定义类 defeat(self): #定义方法 print("吃肉夹馍...真香呀...") defrun(self): print("8百米体测达标...呼哧...")person=Person() #定义对象,并用person变量保存它的引用="张三" #添加表示姓名的属性person.age=18 #添加表示年龄的属性person.eat() #调用方法person.run()print(,person.age) #打印属性值7.1类和对象7.1.3self参数类的所有实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个形参(如果有多个形参)。self参数表示对象本身。在类的实例方法中访问实例属性时需要以self为前缀,但在方法外通过对象名调用对象方法时并不需要传递这个参数。如果在外部通过类名调用对象方法则需要显式为self参数传递值。7.2属性和方法7.2属性和方法7.2.1属性属性分为两种:类属性和实例属性。类属性是在类中所有方法之外定义的数据成员;实例属性一般是指在构造函数__init__()中定义的,定义和使用时必须以self作为前缀;在类的外部,实例属性属于实例对象,只能通过对象名访问;而类属性属于类,可以通过类名或者对象名访问。类属性被所有类的实例对象(实例方法)所共有,在内存中只存在一个副本。7.2属性和方法默认情况下,Python中的成员函数和成员变量都是公开的(public),在Python中没有类似public,private等关键词来修饰方法成员和数据成员。在Python中定义私有成员只需要在属性名或方法名前加上
“__”双下划线,那么这个属性或方法就是私有的了。私有属性在类外不能直接访问,需要通过调用对象的公有方法来访问,或者通过Python支持的特殊方式来访问,可以对象名.类名__xxx方式来访问私有的类属性。7.2属性和方法>>>classPerson():
name="Tom" #公有的类属性
__age=12 #私有的类属性>>>p=Person() >>>print() #通过对象访问公有类属性Tom>>>print(P)#通过类访问公有类属性Tom >>>print(p.__age)#错误,不能在类外通过实例对象访问私有的类属性Traceback(mostrecentcalllast):AttributeError:'Person'objecthasnoattribute'__age'>>>print(p._Person__age) #访问类的私有属性,一般不推荐127.2属性和方法7.2.2方法Python类的方法分为实例方法,类方法和静态方法。实例方法第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传递类的属性和方法);只能由实例对象调用。类方法使用装饰器@classmethod来修饰一个方法,此时该方法就是类方法。类方法的第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);实例对象和类对象都可以调用。7.2属性和方法静态方法使用装饰器@staticmethod来修饰一个方法,此时该方法就是静态方法。静态方法的参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;实例对象和类对象都可以调用。实例方法只能被实例对象调用,类方法和静态方法可以被类或类的实例对象调用。7.2属性和方法>>>classFoo(object):definstance_method(self): #定义实例方法 print("这是类{}的普通实例方法,只能被实例对象调用".format(Foo))@classmethod #定义类方法defclass_method(cls): print("这是类方法")@staticmethod #定义静态方法defstatic_method():print("这是静态方法")>>>foo=Foo()>>>foo.instance_method() #通过对象名来调用实例方法这是类<class'__main__.Foo'>的普通实例方法,只能被实例对象调用7.3构造方法和析构方法7.3构造方法和析构方法Python提供了两种特殊的方法:__init__()和__del__(),分别用于初始化对象属性和释放类所占用的资源,即构造方法和析构方法。7.3.1构造方法在上一节的案例中,我们给person引用的对象动态的添加了name和age属性,如果要创建多个Person类的对象,采用同样的“对象名.属性名称”的方式就显得繁琐了。可不可以在创建对象的时候就设置好属性,Python提供了一个特殊的方法__init__(),被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。7.3构造方法和析构方法>>>classPerson(): #定义类
def__init__(self): #构造方法 ="张三" self.age=18 defrun(self): print("%d岁的%s进行8百米体测达标...呼哧..."%(self.age,))>>>person=Person() #定义对象,并用person变量保存它的引用无论创建多少个Person对象,name和age属性值初始默认都为“张三”和18。如果要在对象创建完成后修改属性的默认值,可以在构造方法中传入参数设定属性的值。7.3构造方法和析构方法>>>classPerson():
def__init__(self,name,age): #带参数的构造方法
=name
self.age=age>>>person1=Person("张三",18) #定义对象,同时传入实参>>>person1.run()18岁的张三进行8百米体测达标...呼哧...>>>person2=Person("李四",20)>>>person2.run()20岁的李四进行8百米体测达标...呼哧...7.3构造方法和析构方法7.3.2析构方法创建对象后,python解释器默认调用__init__()方法;当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法。在python中,对于开发者来说很少会直接销毁对象(如果需要,应该使用del关键字销毁)。Python的内存管理机制能够很好的胜任这份工作。也就是说,不管是手动调用del还是由python自动回收都会触发__del__方法执行。7.3构造方法和析构方法。>>>classPerson():
def__init__(self,name,age):
=name
self.age=age
def__del__(self): #定义析构方法
print("调用del方法删除对象")>>>mickey=Person("米老鼠",18) #定义对象,同时传入实参>>>delmickey #显式调用__del__()方法调用del方法删除对象7.4封装
7.4封装在面向对象的程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其含义是其他程序无法调用。要了解封装,离不开“私有化”,就是将类或者是函数中的某些属性限制在某个区域之内,外部无法调用。封装数据的主要原因是保护隐私,封装方法的主要原因是隔离复杂度。
7.4封装classPerson():def__init__(self,name,age): =name self.__age=age #私有属性defsetAge(self,age): #给私有属性赋值 self.__age=agedefgetAge(self): #获得私有属性的值 returnself.__agelaosun=Person("悟空",18)print(laosun.__age)
7.4封装运行程序后,输出如下错误信息:AttributeError:'Person'objecthasnoattribute'__age‘为了能在外部访问私有属性的值,需要用到该类提供的用于设置和获取属性值的方法。把print(laosun.__age)代码改为setAge和getAge方法,分别对私有属性进行赋值和取值的操作。laosun.setAge(20)print(laosun.getAge())输出结果:207.5
继承
7.5继承面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。语法格式如下:class子类名(父类名):
语句块如果类定义时,没有基类列表,等同于继承自object,在Python3中,object类是所有对象的根基类。例如classPerson等同于classPerson(object)。
7.5继承7.5.1单继承
所谓单继承,就是子类继承了一个父类(基类)
。>>>classAnimal(object): #定义一个动物类
def__init__(self,color):
self.color=color
defrun(self):
print("Animalisrunning...")>>>classDog(Animal): #定义一个动物的子类-狗类pass#空语句
7.5继承>>>classCat(Animal): #定义一个动物的子类-猫类 pass#空语句>>>dog=Dog("黑色")>>>print("狗的颜色",dog.color)狗的颜色黑色>>>dog.run()Animalisrunning...>>>cat=Cat("白色")>>>print("猫的颜色",cat.color)猫的颜色白色>>>cat.run()Animalisrunning...
7.5继承该例定义了一个动物类,该类中有color属性和run方法,然后定义了继承自Animal类的子类Dog和Cat,子类内部没有添加任何属性和方法。从结果可以看出,子类继承了父类的color属性和run方法,子类在创建类实例的时候,使用的是继承自父类的构造方法。注意:父类的私有属性和私有方法是不会被子类继承的,更不能被子类访问。
7.5继承7.5.2多继承多继承,顾名思义就是子类继承了多个父类(基类)。多继承可以看作是对单继承的扩展,通过在子类名称的括号中标注出要继承的多个父类,使用逗号进行分割,多继承的语法格式如下:class子类名(父类名1,父类名2,…):
语句块>>>classKungFu: #定义一个父类
defprintKungfu(self):
print('----功夫----')
7.5继承>>>classPanda: #定义另一个父类
defeat(self):
print('----吃竹子----')
def__init__(self,color):
self.color=color>>>classKungFuPanda(KungFu,Panda): #定义一个子类
defeat(self):#重写父类的方法
print('----吃包子----')
def__init__(self,color,duan): #重写父类的方法
super().__init__(color) #调用父类的init方法
self.duan=duan#增加段位属性
7.5继承>>>Po=KungFuPanda('黑白',"六段") #定义功夫熊猫阿宝>>>Po.eat()----吃包子---->>>print("%s颜色的功夫熊猫阿宝的武功段位是%s"%(Po.color,Po.duan))黑白颜色的功夫熊猫阿宝的武功段位是六段
7.5继承子类同时继承了多个父类的方法并可调用,也可以调用自己创建的方法;调用重写父类的方法eat时,只会调用子类重写的方法,不再调用父类的方法eat,即优先调用子类中重载过的方法;使用super调用父类的构造方法__init__。7.6
多态
7.6多态多态是指不同的子类对象调用相同的父类方法,产生不同的
执行结果,可以增加代码外部调用的灵活性。多态的特征是以继承和重写父类方法为前提,是调用方法的技巧,不会影响到类的内部设计。下面通过一个案例演示多态的使用。>>>classAnimal(): #定义一个动物类
def__init__(self,name):
=name
deftalk(self): #抽象方法,仅由约定定义
print(,'叫!') #当子类没有重写talk方法的时候调用
defanimal_talk(obj): #多态
obj.talk()
7.6多态>>>classDog(Animal): #定义一个动物的子类-狗类
deftalk(self): #重写父类的talk方法
print('%s:汪!汪!汪!'%)>>>classCat(Animal): #定义一个动物的子类-猫类
deftalk(self):#重写父类的talk方法
print('%s:喵喵喵!'%)>>>animal=Animal('动物')>>>dog=Dog('狗狗')>>>cat=Cat('猫咪')>>>Animal.animal_talk(animal) 动物叫!>>>dog.animal_talk() #多态调用狗狗:汪!汪!汪!>>>Animal.animal_talk(cat) #多态调用猫咪:喵喵喵!
7.6多态从结果
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 眼科患者的心理护理
- 排水管涵施工方案
- 提高护理服务质量的评估方法
- 2026年纳米材料在绿色建筑保温中应用
- 护理技能实操的模拟训练
- 管桩施工方案.钢结构实验学校预应力
- 2026年细胞工厂外泌体规模化制备技术
- 2026年十五五服务机器人新质生产力核心攻关与投资主线
- 智能护理技术在儿科护理中的应用
- 管道防腐施工方案
- JG/T 270-2010工业构筑物水泥基耐磨材料
- 离婚合同打印(2025年版)
- -数码相机-佳能-EOS77D(基本使用说明书)说明书
- 企业常用公文写作培训及案例分析
- 扩建10000吨-年高纯级羧甲基纤维素钠项目环评资料环境影响
- 工资表范本标准版
- DG-TJ 08-2242-2023 民用建筑外窗应用技术标准
- 2024年新疆中考历史试卷试题答案解析及备考指导课件(深度解读)
- 售楼处服务方案
- 腰椎JOA评分 表格
- 阳泉煤业集团兴峪煤业有限责任公司煤炭资源开发利用和矿山环境保护与土地复垦方案
评论
0/150
提交评论