zoukankan      html  css  js  c++  java
  • Python中的继承

    灵魂三问

    什么是继承?

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

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

    继承是类与类之间的关系

    为什么要继承?

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

    如何用继承?

    单继承

    class grandFather():
      	print('我是爷爷')
    
    class Parent(grandFather):
      	print('我是父类')
      
    class SubClass(Parent):
    	  print('我是子类')
        
    sub = SubClass() 
    
    #结果:我是爷爷
    #			我是父类
    #			我是子类
    #注意:类在定义的时候就执行类体代码,执行顺序是从上到下
    

    多继承

    class Parent2():
        print('我是第二个爹')
    
    class Parent():
        print('我是第一个爹')
        
    class SubClass(Parent, Parent2):
        print('我是子类')
        
    #	
    # 结果:我是第二个爹
    #			 我是第一个爹
    # 		 我是子类
    #注意:类在定义的时候就执行类体代码,执行顺序是从上到下
    
    • 使用__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中有经典类。

    继承与抽象

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

    class Animals:
      	pass
      
    class Pig(Animals):
      	pass
     
    class Dog(Animals):
      	pass
      
    class Cat(Animals):
      	pass
    

    派生类

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

    class Animals:
    		pass
    		
    class Dog(Animals):
      	pass
      
    #这时候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

    菱形继承

    类的继承图是从一个类开始继承,继承到顶点时,多个类继承同一个顶点,这种就叫做菱形继承。菱形继承查找类时就用广度查找。什么叫广度查找呢?TMD, 不想写了。

    遇到共同父类时就广度

    经典类都是深度优先

  • 相关阅读:
    API协议
    执行聚合
    执行过滤
    执行查询
    介绍查询语言
    探索你的数据
    探索你的集群(翻译)
    es6.4基本概念(中文翻译)
    Python3.7.4安装
    elasticsearch常用请求
  • 原文地址:https://www.cnblogs.com/KbMan/p/11247473.html
Copyright © 2011-2022 走看看