您当前的位置:首页 > 计算机 > 编程开发 > Python

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

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

一、继承

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

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