首页 > 编程语言 > 详细

python基础-面向对象(六)类的继承

时间:2020-12-09 18:35:55      阅读:36      评论:0      收藏:0      [点我收藏+]

一.什么是继承?

继承:类的继承就跟现实生活一样,父、子、孙。父类又称为基类

继承分为单继承和多继承

class Parent1:
    pass
class Parent2:
    pass
class Son1(Parent1): #单继承
    pass
class Son2(Parent1,Parent2): #多继承
    pass

二.为什么要继承?

  1 减少代码冗余、提高重用性(代码重用就耦合了,这个不是重点)

  2 归一化设计。(相同的代码有相同的功能,比如猫会吃喝拉撒,狗也会吃喝拉撒,定义基类,动物类,包含吃喝拉撒,是为了确保猫和狗都必须有吃喝拉撒,用户一看到吃喝拉撒就知道是干什么的)

三.继承了父类的什么属性?

  数据属性和函数属性都继承了。

class Dad:
    money = 10

    def __init__(self, name):
        self.name = name

    def hit_son(self):
        print(%s正在打儿子 % self.name)


class Son(Dad):
    pass


son1 = Son(alex)
print(son1.money)  # 调用父类的数据属性
son1.hit_son()  # 调用父类的函数属性
print(Dad.__dict__)
print(Son.__dict__)

技术分享图片

 

 

四.什么时候用继承?

1.当类之间明显不同,但又有关联的时候用组合(如学校和老师)

2.当类之间有很多相同的功能,提取这些功能做成基类,用继承(如猫吃喝拉撒,狗也吃喝拉撒。可以做个动物基类,吃喝拉撒)

 

五.接口继承,归一化设计

归一化设计。相同的代码有相同的功能,比如猫会吃喝拉撒,狗也会吃喝拉撒,定义基类,动物类,包含吃喝拉撒,是为了确保猫和狗都必须有吃喝拉撒,用户一看到吃喝拉撒就知道是干什么的。

要求必须重写,可以abc模块

import abc


class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def chi(self):
        pass

    @abc.abstractmethod
    def he(self):
        pass

    def la(self):
        pass

    def sha(self):
        pass


class Dog(Animal):
    def chi(self):
        pass

    def he(self):
        pass


dog1 = Dog()

六.继承顺序

经典类(没有继承object的)是深度优先。新式类是广度优先。新式类可用__mro__查看

class A:
    pass


class B(A):
    pass


class C(A):
    pass


class D(B):
    pass


class E(C):
    pass


class F(E, D):
    pass


print(F.mro())

技术分享图片

 

 继承顺序:先子类后父类。同时继承多个,先继承写在前面的

七.子类中调用父类方法

class Vehicle:
    Country = China

    def __init__(self, name, speed, power):
        self.name = name
        self.speed = speed
        self.power = power

    def run(self):
        print(开动啦)


class Subway(Vehicle):
    def __init__(self, name, speed, power, line):
        # Vehicle.__init__(self, name, speed, power)
        super().__init__(self, name, speed, power)
        self.line = line


subway1 = Subway(复兴号, 100m/s, elc, 19号线)
print(subway1.name, subway1.speed)

技术分享图片

 

 如果父类名字修改后,代码都要改名字,为了避免这种情况,可使用super()代替父类的名字

 

python基础-面向对象(六)类的继承

原文:https://www.cnblogs.com/liaoyifu/p/14109770.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!