2025年3月31日 星期一 乙巳(蛇)年 正月初一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

python精选13集(继承、多态)

时间:04-25来源:作者:点击数:49

一、继承

1、语法:

  • class 子类(父类):
  • def __init__(self,参数列表):
  • super().__init__(参数列表)
  • self.自身实例变量 = 参数
  • 设计角度: 先有子类,再有父类. 抽象化的过程:子(具体,小概念) -> 父(抽象,大概念)
  • 编码角度: 先写父类,再写子类.

2、说明:

  • 子类拥有父类的所有成员。
  • 子类如果没有构造函数,将自动执行父类的,但如果有构造函数将覆盖父类的。
  • 此时必须通过super()函数调用父类的构造函数,以确保父类属性被正常创建。

Demo【单继承】

在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物;同理,波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承足够,如下如所示:

在这里插入图片描述
  • # 定义一个父类,如下:
  • class Cat(object):
  • def __init__(self, name, color="白色"):
  • self.name = name
  • self.color = color
  • def run(self):
  • print("%s--在跑"%self.name)
  • # 定义一个子类,继承Cat类如下:
  • class Bosi(Cat):
  • def setNewName(self, newName):
  • self.name = newName
  • def eat(self):
  • print("%s--在吃"%self.name)
  • bs = Bosi("印度猫")
  • print('bs的名字为:%s'%bs.name)
  • print('bs的颜色为:%s'%bs.color)
  • bs.eat()
  • bs.setNewName('波斯')
  • bs.run()

代码跑起来

在这里插入图片描述

说明:

虽然子类没有定义__init__方法,但是父类有,所以在子类继承父类的时候这个方法就被继承了,所以只要创建Bosi的对象,就默认执行了那个继承过来的__init__方法

3、总结

  • 子类在继承的时候,在定义类时,小括号()中为父类的名字
  • 父类的属性、方法,会被继承给子类

二、多继承

  • 一个子类继承两个或两个以上的基类,父类中的属性和方法同时被子类继承下来。
  • 同名方法的解析顺序(MRO, Method Resolution Order):

类自身 --> 父类继承列表(由左至右)–> 再上层父类

  • A
  • / \
  • / \
  • B C
  • \ /
  • \ /
  • D

1、定义

  • 重用现有类的功能与概念,并在此基础上进行扩展。

2、说明:

  • 子类直接具有父类的成员(共性),还可以扩展新功能。
  • 事物具有一定的层次、渊源,继承可以统一概念。

Demo【多继承】

在这里插入图片描述
  • 从图中能够看出,所谓多继承,即子类有多个父类,并且具有它们的特征

Python中多继承的格式如下:

  • # 定义一个父类
  • class A:
  • def printA(self):
  • print('----A----')
  • # 定义一个父类
  • class B:
  • def printB(self):
  • print('----B----')
  • # 定义一个子类,继承自A、B
  • class C(A,B):
  • def printC(self):
  • print('----C----')
  • obj_C = C()
  • obj_C.printA()
  • obj_C.printB()
  • 代码跑起来
    ----A----
    ----B----

说明

  • python中是可以多继承的
  • 父类中的方法、属性,子类会继承

优点:

<1> 一种代码复用的方式。

<2> 以层次化的方式管理类。

缺点:耦合度高

作用:隔离客户端代码与功能的实现方式。(抽象(代表)变化点,隔离用与做.)

适用性:多个类在概念上是一致的,且需要进行统一的处理。

3、相关概念

父类(基类、超类)、子类(派生类)。

父类相对于子类更抽象,范围更宽泛;子类相对于父类更具体,范围更狭小。

单继承:父类只有一个(例如 Java,C#)。

多继承:父类有多个(例如C++,Python)。

Object类:任何类都直接或间接继承自 object 类。

4、内置函数

isinstance(obj, class_or_tuple)

返回这个对象obj 是否是某个类的对象,或者某些类中的一个类的对象。

Demo【内置函数】

  • # 判断对象是否属于一个类型
  • print(isinstance(s01, Person)) # true
  • print(isinstance(s01, Teacher)) # false
  • print(isinstance(s01, (Person, Teacher))) # true
  • print(isinstance(s01, Student)) # true
  • # 判断一个类型是否属于另一个类型
  • print(issubclass(Teacher, Person)) # true
  • print(issubclass(Teacher, Student)) # false
  • print(issubclass(Person, Student)) # false
  • print(issubclass(Person, Person)) # true
  • # 如果判断父子
  • print(issubclass(Teacher, Person) and Teacher != Person) # true
  • print(issubclass(Teacher, Teacher) and Teacher != Teacher) # false

三、多态

1、定义

父类的同一种动作或者行为,在不同的子类上有不同的实现。(调用父类,执行子类.)

Demo【调用父类方法】

  • class Cat(object):
  • def __init__(self,name):
  • self.name = name
  • self.color = 'yellow'
  • class Bosi(Cat):
  • def __init__(self,name):
  • # 调用父类的__init__方法1(python2)
  • #Cat.__init__(self,name)
  • # 调用父类的__init__方法2
  • #super(Bosi,self).__init__(name)
  • # 调用父类的__init__方法3
  • super().__init__(name)
  • def getName(self):
  • return self.name
  • bosi = Bosi('xiaohua')
  • print(bosi.name)
  • print(bosi.color)
  • 代码跑起来
  • xiaohua
  • yellow

2、作用

1.继承将相关概念的共性进行抽象,多态在共性的基础上,体现类型的个性化(一个行为有不同的实现)。

2.增强程序扩展性,体现开闭原则。

3、重写:

子类实现了父类中相同的方法(方法名、参数),在调用该方法时,实际调用的是子类的方法。(变化点重写。)

Demo【重写】

  • #coding=utf-8
  • class Cat(object):
  • def sayHello(self):
  • print("halou-----1")
  • class Bosi(Cat):
  • def sayHello(self):
  • print("halou-----2")
  • bosi = Bosi()
  • bosi.sayHello()
  • 代码跑起来
  • halou-----2

四、总结

1、面向对象三大特征【封装、继承、多态】

<1> 封装【设计角度分析】

(1)分而治之

– 将一个大的需求分解为许多类,每个类处理一个独立的功能。 (类要小而精,拒绝大而全.)

– 拆分好处:便于分工,便于复用,可扩展性强。

(2) 封装变化

– 变化的地方独立封装,避免影响其他类。(分解的度,识别变化点,单独做成类.)

(3) 高 内 聚

– 类中各个方法都在完成一项任务(单一职责的类)。(类内部,高度聚集.完成一个变化点。)

(4) 低 耦 合

– 类与类的关联性与依赖度要低(每个类独立),让一个类的改变,尽少影响其他类。(类与类关系,尽量松散。)

<2> 继承

(1)定义:重用现有类的功能,并在此基础上进行扩展。

(2)说明:子类直接具有父类的成员(共性),还可以扩展新功能。

(3)优点:一种代码复用的方式。

(4)缺点:耦合度高:父类的变化,直接影响子类。

<3> 多态

(1)定义:父类的同一种动作或者行为,在不同的子类上有不同的实现。(调用父类,执行子类.)

(2)作用:

  • 继承将相关概念的共性进行抽象,多态在共性的基础上,体现类型的个性化(一个行为有不同的实现)。
  • 增强程序扩展性,体现开闭原则。
  • 重写

(3)子类实现了父类中相同的方法(方法名、参数),在调用该方法时,实际调用的是子类的方法。(变化点重写)

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门