python中的继承

什么是继承?

继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。

特点:子类可以使用父类的属性(特征、技能)

继承是类与类之间的关系

注意:在python3中,object类是所有类的基类,默认认object为基类,python2中没有确定object是基类

为什么要继承?

减少代码冗余、提高重用性

如何用继承?

单继承

class grandFather():
    print('我是爷爷')

class Parent(grandFather):
    print('我是父类')
  
class SubClass(Parent):
      print('我是子类')
    
sub = SubClass() 

#结果:我是爷爷
#           我是父类
#           我是子类
#注意:类在定义的时候就执行类体代码,执行顺序是从上到下

多继承

注意:多个父类之间用“,”隔开

class Parent2():
    print('我是第二个爹')

class Parent():
    print('我是第一个爹')
    
class SubClass(Parent, Parent2):
    print('我是子类')
    
#   
# 结果:我是第二个爹
#            我是第一个爹
#        我是子类
#注意:类在定义的时候就执行类体代码,执行顺序是从上到下,
#注意:这个顺序只跟类创建时的顺序有关,与子类引用的顺序无关,与SubClass(Parent, Parent2)的顺序无关
#使用__bases__方法可以获取子类继承的类

使用__bases__方法可以获取子类继承的类

class Parent2():
    print('我是第二个爹')

class Parent():
    print('我是第一个爹')

class SubClass(Parent, Parent2):
    print('我是子类')

print(SubClass.__bases__)
#注意,如果sub = SubClass(),sub是没有__bases__方法的

新式类、经典类

  • 继承了object的类以及该类的子类,都是新式类。

在Python3中如果一个类没有继承任何类,则默认继承object类。因此python3中都是新式类

  • 没有继承object的类以及该类的子类,都是经典类。

在Python2中如果一个类没有继承任何类,不会继承object类。因此,只有Python2中有经典类。

继承与抽象

抽象:通过抽象可以得到类,抽象是一种分析的过程。例如:从小猪佩奇、猪八戒、猪刚鬣、猪猪侠这些具体的对象中,可以分析一下,抽象出一个类,这个类就是猪类。接着,可以从猪、猫、狗等中,可以抽象出一个动物类。先分析、抽象之后,就可以通过继承,在程序上实现这个结构。

派生类

概念:派生,就是在子类继承父类的属性的基础上,派生出自己的属性。子类有不同于父类的属性,这个子类叫做派生类。通常情况下,子类和派生类是同一个概念,因为子类都是有不同于父类的属性,如果子类和父类属性相同,就没必要创建子类了。

  
#这时候Dog类不是派生类
class Animals:
    def __init__(self, name):
        self.name = name
       
    def walk(self):
                print('我会走')
       
class Dog(Animals):
    #Dog类派生出bite功能
    #派生:狗有咬人的技能
    def bite(self):
        print('我会咬人')

组合

除了继承之外,还有一种提高重用性的方式:组合

组合指的是,在一个类A中,使用另一个类B的对象作为类A的数据属性(特征)(变量),成为类的组合。

#例子:人和手机,人想要有打电话的功能,想要打电话,就需要用到手机,人想要用到手机里面的打电话功能,肯定不能用继承,人继承手机就非常尴尬了,这时候就可以用到组合。
class Mobile():
    def __init__(self, color):
        self.color = color
        
    def call(self):
        print('老子可以打电话')
        
class People():
    def __init__(self, name, mobile):
        self.name = name
        self.mobile = mobile
        
mobile = Mobile('yellow')
people = People('小白', mobile)
people.mobile.call()

#结果:老子可以打电话

继承建立了派生类和基类的关系,是一种是的关系,比如白马是马,人是动物。

组合建立了两个类之间'有'的关系,比如人有手机,然后人可以使用手机打电话。

属性查找顺序

对象查找属性的顺序:对象自己的 - > 所在类中 -> 找父类 - >父类的父类 ->Object

覆盖

也称之为重写 overrides

当子类出现了与父类名称完全一致的属性或是方法

子类中访问父类的内容

方式1:
super(当前类名称,self).你要调的父类的属性或方法
方式2:
super().你要调的父类的属性或方法
方式3:
类名称.你要调的父类的属性或方法(self)

强调再强调:

当你继承一个现有的类,并且你覆盖了父类的init方法时,必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数

类的mro方法

mro方法可以列出类继承的所有父类,并且有顺序。调用mro方法要用类名.mro

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值