Python学习笔记 继承和派生

目录

  继承和派生
  组合
  抽象类

继承和派生

  继承是一种在已有类的基础上创建新类的过程。通过继承创建的新类称为子类或派生类,被继承的类称为父类、基类或超类。

  子类会继承父类的属性和方法,当我们定义了一个类A,然后又想定义一个类B,但类B的大部分内容都与类A相同,这时候我们就可以让类B继承类A,从而避免重写类B和类A相同的那部分内容。所以说,继承其实是实现代码重用的一种方式。

  Python中的继承有单继承和多继承两种方式,单继承是指子类继承自一个父类,如下面的类 SonClass1;多继承是指子类同时继承自两个或两个以上的父类,如下面的类 SonClass2。

class ParentClass1:
    def p1(self):
        print('parent one')
class ParentClass2:
    def p2(self):
        print('parent two')
class SonClass1(ParentClass1):
    def son_one(self):
        print('son one')
class SonClass2(ParentClass1, ParentClass2):
    def son_two(self):
        print('son two')
print('mro列表:', SonClass1.mro())
print('第一个父类:', SonClass1.__base__) # 定义该类时,括号内从左至右的第一个父类
print('父类列表:', SonClass1.__bases__) # 即定义该类时,括号内的所有父类
print('*'*50)
print('mro列表:', SonClass2.mro())
print('第一个父类:', SonClass2.__base__)
print('父类列表:', SonClass2.__bases__)
'''
mro列表: [<class '__main__.SonClass1'>, <class '__main__.ParentClass1'>, <class 'object'>]
第一个父类: <class '__main__.ParentClass1'>
父类列表: (<class '__main__.ParentClass1'>,)
**************************************************
mro列表: [<class '__main__.SonClass2'>, <class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>, <class 'object'>]
第一个父类: <class '__main__.ParentClass1'>
父类列表: (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
'''

PS:在Python中,所有的类都默认继承自一个叫 object 的类,object类中定义了一些基本的方法,如__str__等。

  对象和类与子类和父类在某种程度上是很相似的

'''
对象:我是通过类的实例化创建的
子类:我是通过对父类的继承创建的

对象:在代码中,现有的类再有的我,但是类可以看做是对很多个我的抽象化产生的
子类:在代码中,也是现有的父类再有的我,父类也可以看做是对很多个我的抽象化产生的

对象:我可以访问类的属性和方法
子类:我也可以访问父类的属性和方法

对象:我可以创建自己特有的属性,如果我的属性与类的属性重名,那么会优先访问我自己的属性
子类:我也可以创建自己特有的属性,如果我的属性与父类的属性重名,那么也会优先访问我自己的属性
'''

  图示
在这里插入图片描述
  派生
    派生的字面意思是指从一个主要事物的发展中分化出来。而这种分化往往伴随着变化。
    类的派生可以看做在原来类的基础上增删改了某些属性或方法。比如使类A在继承类B的基础上创建自己的方法,那么此时就可
  以说A是B的派生类。
    通过继承所创建的类都可称为派生类(因为如果毫无变化,那继承就没有意义)。

组合

  组合的概念很简单,即在一个类中以另外一个类的对象作为数据属性。它与继承一样,也是实现代码重用的一种方式。

class A:
    pass
class B:
    sample = A()
    #在类B中以类A的对象作为数据属性

PS:继承和组合都是代码重用的重要方式,但两者的概念和使用场景都不同。继承建立的是子类和父类的关系,这是一种‘是’的关系,比如猫是动物;组合建立的则是类和类之间‘有’的关系,比如关羽有赤兔马。

抽象类

  简单来说,抽象类就是一种含有抽象方法(没有具体实现的方法)的类。抽象类的实现需要用到abc模块,所以抽象类有时也称为ABC类。
  抽象类可以没有属性,也可以没有具体的方法,但它至少要含有一个抽象方法。
  与其他类相比,抽象类具有只能被继承的特点;无论是抽象类,还是它的子类,只要含有一个抽象方法,那么这个类就不能被实例化

import abc
class Animal(metaclass=abc.ABCMeta):
    name = None
    @abc.abstractmethod
    def manger(self):
        pass
    @abc.abstractmethod
    def boire(self):
        pass
class Cat(Animal):
    def manger(self):
        print('吃吃')
    def boire(self):
        print('喝喝')
# class Dog(Animal):
#     def manger(self):
#     # 只实现一个抽象方法
#         print('吃吃')
# dog = Dog() # Can't instantiate abstract class Dog with abstract methods boire
cat = Cat()
cat.manger()
# 吃吃

PS:抽象类的作用是设定类的标准,规范其子类的行为和接口(必须实现其所有抽象方法才能被实例化)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值