一文弄懂Python面向对象的三大特性:继承、封装、多态

前面给大家介绍了两个关于Python面向对象编程的实战案例,相信大家对面向对象的理解更进一步了。这里,小编再给大家介绍一个重点——面向对象的三大特性:继承、封装、多态,只有充分的理解了这三大特性,在做面向对象编程时才会得心应手

基本概念

  • 继承:两个类之间具备一定的关系,这种关系允许一个类访问另外一个类的方法和属性。也就是我们常说的父类和子类:父类是指被访问的类;子类是指访问的类
  • 封装:对类的自身属性和方法进行保护,不被外部类访问。形象来说就是用个“箱子”装起来
  • 多态:一种接口,多种形态。通过一种接口,实现不同的目的。
一文弄懂Python面向对象的三大特性:继承、封装、多态

案例分析:继承特性

<code># 定义一个父类
class Father:
def __init__(self,name,age):
print("姓名是:{},年龄是:{}".format(name,age))
def playGame(self,gameName):
print("喜欢玩的游戏是{}".format(gameName))/<code>

首先,我定义了一个父类Father,它有两个属性,分别是姓名和年龄。然后,我们给父类初始化1个方法:将姓名和年龄打印出来;同时我们还给这个类定义了另外一个方法:playGame,将喜欢玩的游戏打印出来。

<code>father1=Father("父亲1","50")
father1.playGame("DOTA")/<code>

接下来,我们给这个类实例化一个对象father1,并给它传入两个属性,姓名:“父亲1”,年龄:“50”,然后我们通过这个对象调用Father类的方法playGame。

<code># 定义一个子类
class Children(Father):
def playLive(self):
print("喜欢看直播")
child1=Children("儿子1",20)
child1.playGame("王者荣耀")/<code>

现在,我们再定义一个子类Children,让它继承父类Father,然后定义一个方法玩直播playLive。接下来我们再给子类实例化一个对象child1,

因为它继承了父类,所以我们可以给它传入父类的属性,姓名:“儿子1”,年龄:“20”;同时我们还可以调用父类的方法,比如playGame,这就是面向对象的继承特性。在一些不是个性化的方法需求上,我们可以通过继承使用代码重用,提高复用率。

这里大家思考一下,我们是可以通过子类调用父类的属性和方法,假如我们需要一个类,不允许别的类访问自己的属性和方法等该怎么办呢?

一文弄懂Python面向对象的三大特性:继承、封装、多态

案例分析:封装特性

<code>class Father:
# 私有属性
__smoking=True
# 公有属性
working=True/<code>

一般情况,每个类都有自己公有属性和私有属性,也就是像每个人都有自己可以公开的信息和不能公开的信息。那么,如果不想公开自己的私有属性,那就可以将“私有属性”进行封装。比如,我们在父类下定义一个“私有属性”smoking(以双下划线开头),子类是不能直接访问的,而working属性是可以被直接访问的。

<code>    # 赋值
def setSmoking(self,smoke):
self.__smoking=smoke
# 获得值
def getSmoking(self):
print(self.__smoking)/<code>

子类想访问父类的属性,无非就是两种情况:获得父类的属性值;给父类的属性重新赋值。所有如果要想访问“私有属性”,就可以这样进行封装:分别定义两个方法,一个用来获取父类的属性值,一个用来给父类的属性重新赋值,子类只需要调用父类的这两个方法,就可以访问父类的属性了

<code>child1.setSmoking("False")
child1.getSmoking()/<code>

访问__smoking这个私有属性时,我们调用setSmoking这个方法,并给它写入属性False,然后再调用父类getSmoking这个方法,就可以看到__smoking的值被修改为False,即child不smoking:

<code>child2=Children("儿子2",15)
child2.setSmoking(True)
child2.getSmoking()/<code>

我们再实例化另外一个子类child2,来调用__smoking属性,运行之后可以看到,即child2是smoking:

一文弄懂Python面向对象的三大特性:继承、封装、多态

案例分析:类的多态

多态性是面向对象在一定条件下才会出现的一种特性:

  • 多态一定是子类和父类之间
  • 多态子类重写了父类方法
一文弄懂Python面向对象的三大特性:继承、封装、多态

下面的代码定义了Children3类 、Children4和Children5类,

三者都继承于Father1类,并且都重写了父类的payType方法,所有它具备多态性。

<code>class Father1():
def payType(self,goodsType):
print("不同的人买东西的方式")
goodsType.buy(self)
class Children3(Father1):
def buy(self,payType):
print("孩子3买东西的方式:现金")
class Children4(Father1):
def buy(self,payType):
print("孩子4买东西的方式:支付宝")
class Children5(Father1):
def buy(self,payType):
print("孩子5买东西的方式:微信")
child=Father1()
child.payType(Children3())
child.payType(Children4())
child.payType(Children5())/<code>

在调用Father1类的payType方法时,程序并不关心为该方法传入的参数对象children是3、4、5的那哪,只要求此参数对象children包含payType方法即可,而调用者传入的参数对象是来源于哪个类,程序并不在乎,这就是面向对象的多态性。

针对上面的实例,如有任何疑问,欢迎在评论区留言或者私信小编,小编会认认真真为大家解答哦!

喜欢小编的讲解思路的朋友,欢迎点下“关注”,非常感谢大家的支持!


分享到:


相關文章: