频道栏目
首页 > 资讯 > Python > 正文

Python面向对象编程,封装,继承,多态等实例教程

18-07-26        来源:[db:作者]  
收藏   我要投稿

一 面向对象编程

面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。

它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。

1.面向对象编程中类的设计

在程序设计中,要设计一个类,通常要满足下面三个要求:

1 类名:这类事物的名字,满足大驼峰命名法

2 属性:这类事物具有什么样的特征

3 方法:这类事物具有什么样的行为

2. 类定义的格式

类的定义通常使用class关键字来声明这是一个类,用def关键字来声明这是类中的一个方法。

格式:

class 类名:

def 方法1(self,参数列表):

pass

def 方法2(self,参数列表):

pass

当一个类定义完成之后,要使用这个类来创建对象,语法格式为: 对象变量=类名()

简单举例:定义一个Study类,包含两个方法learn和practice,分别执行不同的效果:

使用对象变量=类名()的格式来创建对象,使用对象变量.方法名的格式来调用类中的方法,输出结果为:

这样就完成了对于一个简单类和方法的定义,并建立对象和使用类的方法。

3. 关于定义方法时使用到的self:

哪一个对象调用的方法,self就是哪一个对象的引用。

输出结果:self指向的是对象的内存地址

4. 定义类时的方法:

初始化方法:

当使用类名创建对象时,python的解释器会自动执行以下操作:

1. 为对象在内存中分配空间----创建对象

2. 调用初始化方法为对象的属性设置初始值----初始化方法(__init__方法)。__init__方法是对象的内置方法,专门用来定义一个类具有哪些属性

举例:定义初始化方法,初始化方法中定义了几个属性,在用类创建对象的时候,就需要传入几个属性值。此处初始化方法只定义了一个属性值add_name,所以在建立对象的时候,需要传入这个属性的值。

初始化方法定义之后的输出结果:

__del__方法:

在python中,为对象分配完空间之后,自动调用__init__方法,当一个对象从内存中销毁之前,会自动调用__del__方法。

最后自动调用del方法,del方法的会在最后执行。输出结果:

提前调用del方法:

提前调用del方法,del方法将在调用时执行。输出结果:

__str__方法:

如果在开发中,希望使用print输出对象变量时,能够打印自定义内容,就可以使用__str__这个方法了。简单地来说,__str__方法就是一种对输出的自定义描述。

举例:在类A中定义一个__str__方法,这个方法必须返回的是一个字符:

输出结果:

二 封装

1. 封装的一些相关概念和简单举例:

封装是面向对象编程的一大特点

面向对象编程的第一步,就是将属性和方法封装到一个抽象的类中

外界使用类创建对象,然后让对象调用方法

对象方法的细节都被封装在类的内部

举例:定义一个类,并定义方法,实现功能:某某每次跑步会减重0.5公斤,吃东西会增加1公斤:

输出结果:

2. 封装的应用举例一:摆放家具

应用需求:

1 房子有户型,总面积和家具名称列表,新房子没有任何的家具

2 家具有名字和占地面积

3 将家具添加到房子中

4 输出十,要求输出:户型,总面积,剩余面积,家具名称列表

设计:

分别定义两个类,家具类和房子类:

输出结果: 当所有的家具占地面积小于房子面积时,正常输出:

当添加家具后剩余面积不足时,显示提示信息:

封装的应用举例二:士兵开枪

应用需求:

1 士兵有一把抢,士兵姓名和枪类型自定义

2 士兵可以开火

3 枪能够发射子弹

4 枪能够装填子弹

设计:定义枪类和士兵类

输出结果:

士兵有枪时,开火射击:

把将枪给士兵的一行代码注释掉,即士兵没有枪:

输出士兵没有枪的结果:

三 继承

继承:实现代码的重用,相同的代码不需要重复编写。继承父类方法的子类可以调用父类的方法。

在定义子类时,在子类名后面的括号里写上父类的名称,表示这个子类继承父类的方法。

1.举例:定义一副上联的父类与子类:

输出结果:

2. 继承的扩展:

对于子类继承父类的方法,在使用时如果有必要可以进行对父类方法的扩展。具体的应用形式为在子类定义的方法中,调用父类的方法,并将想要扩展的功能一起写入这个子类的方法中。这样子类方法在调用时,输出的结果就是子类方法和父类方法共同作用出的结果。以以下代码为例,在调用父类SmallFish的aeat方法时,在其输出结果前面加上一句“大鱼吃小鱼”:

输出结果:

3. 继承的覆盖(重写)

在子类继承父类的方法时,如果不需要父类的某个方法而想重新定义一个心新的方法,可以进行父类方法的重写。具体的应用形式为,在子类的定义方法中,定义一个与想要覆盖的父类方法同名的方法,这样在调用这个方法时,新的方法会将父类的方法覆盖掉,父类方法在调用时失去其本身的职能。以以下代码为例,在子类SmassFish中定义一个与父类Shrimp同名的eat方法,将原来方法的输出结果“虾吃水”覆盖为“小鱼说我不想吃虾了我想吃大鱼”

输出结果:

4. 关于两个类中都含有初始化定义的继承:

如果两个类中都含有初始化定义的方法,那么在继承时就需要在定义子类方法时,以调用的形式首先执行父类的初始化方法,否则在调用时是会因为初始化方法没有特定的指向而报错.

输出结果:

5. 一个子类继承多个父类时,多个父类中同名方法的调用情况:

如果一个子类同时继承多个父类的方法,而这些父类又含有同名方法,那么子类在调用这些同名方法时,调用的结果将由继承的父类的先后顺序决定,后继承的父类的方法将被覆盖而失去作用。

举例:子类Third同时继承父类First和Second,两个父类中含有同名方法A:

在调用父类的A方法时,默认调用的是第一个继承的父类的A方法,即输出“我才First类被继承”:

当子类继承的父类顺序交换时:

调用父类的同名方法时,输出结果还是决定于第一个继承的父类方法:

6 继承的新式类和旧式类

继承的新式类和旧式类是不同Python版本的不同定义方式,区别在于新式类在定义时类名后面加上一个object,在使用dir指令进行对象的操作时,输出的结果不同,即新式类多了一些新的方法

输出结果:新式类有较多的方法:

四 多态

多态:不同的子类调用相同的方法,产生不同的执行结果

将父类的输出结果以形参的方式传入到子类(此处这个形参在子类Fish中表现为aaa),父类中含有同名的方法,在子类中调用这个同名的方法。这样当子类形参传入的实参来自不同的父类时,子类中调用的同名父类方法将产生不同的输出结果。

举例:父类同名方法eat,子类方法形参aaa:

输出结果:

将形参aaa传入的实参值bbb修改为另一个父类的输出:

执行结果发生改变:

相关TAG标签
上一篇:mysql 物理备份教程之差异备份实现
下一篇:删除节点后重新加入时出现错误(解决教程)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站