day_20_类的三大特征

1、继承

1.1 什么是继承

  • 继承指的是新建类的方法,新建的类称之为子类或者派生类

子类继承的类叫做父类,也称之为基类或超类

  • 继承的特征:

​ 子类可以继承父类的属性(特征和技能),并且可以派生出自己的属性(特征与技能)

​ 注意:在pyhton中,一个子类可以继承多个父类,其他语言只能一个子类继承一个父类

1.2 为什么要继承

​ 继承的目的是为了减少代码冗余,实现代码复用

1.3 如何实现继承

  • 首先要确定好谁是子类,谁是父类

  • 在定义类时,子类名 + (),()内写父类名,实现继承

    class A:
        x = 10
        pass
    class B(A):
        pass
    print(B.x)
    '''
    10'''
    

1.4 继承父类后,对象属性调用的查找顺序

先后顺序如下:

1、对象自身名称空间

2、类名称空间

3、父类名称空间

4、若继承多个父类,则按照从左到右的顺序查找父类名称空间

1.5 派生

​ 子类继承父类的属性,并且派生出新的属性

子类派生出新的属性,若与父类属性相同,则以子类为准

1.51 子类派生时,对父类属性的复用

  • 类名.属性方式()

    class OldboyPeople:
    	def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
            
    class OldboyTeacher(OldboyPeople):
        def __init__(self,name,age,sex,leval,salary):
            # 通过类调用类自身函数的方法,直接调用父类属性
            OldboyPeople.__init__(self,name,age,sex)  
            # 派生的新属性
            self.leval = leval
            self.salary = salary
            
    
  • super()方法

    class OldboyPeople:
    	def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
            
    class OldboyTeacher(OldboyPeople):
        def __init__(self,name,age,sex,leval,salary):
            #  通过super()方法获取父类,再调用父类的属性
            super().__init__(name,age,sex)  # 按照类的继承顺序,去下一个顺位的名称空间中查找__init__
            #  派生的新属性
            self.leval = leval
            self.salary = salary
    

1.6 钻石继承

在多继承的情况下形成的钻石继承(继承顺序,或对象属性的查找顺序)

  • 经典类(只在python2中出现,没有继承object类的类)

    按深度优先查找,即:

    1、从左至右查找父类

    2、每一个父类的的第一个子类查找完就查找这个父类,一直到最顶层的父类

    3、当父类查找完了,再查找该父类剩余的子类

  • 新类(继承了object类的类,python3只有新类)

    按广度优先查找:

    1、从左至由查找父类

    2、每一个父类的子类查找完了之后,才会查找这个父类,不管这个父类处于哪一个层级

验证:

继承图解:

第一层:F H

第二层:E(F,H) G(H)

第三层:B(E) C(E) D(G)

第四层:A(B,C,D)

代码验证:

class F:
    def test(self):
        print('from F')
    pass

class H:
    def test(self):
        print('from H')
    pass

class G(H):
    def test(self):
        print('from G')
    pass


class E(F,H):
    def test(self):
        print('from E')
    pass

class B(E):
    def test(self):
        print('from B')
    pass

class C(E):
    def test(self):
        print('from C')
    pass

class D(G):
    def test(self):
        print('from D')
    pass

class A(B,C,D):
    def test(self):
        print('from A')
    pass

a1 = A()
a1.test()

2、封装

封装是一种思想,不是一种技术手段

解释:在类中,封装就是把一堆属性放到一个对象中

目的:方便存取,通过对象.属性的方式获取属性

方式:变量 ---> 数据属性

​ 函数 ---> 方法属性

用到封装思想的有:

列表、字典、集合等

函数、模块、包等

3、多态

指的是一类事物有多种形态,即可以将类A细分为多种类B,C,D,他们具有相同的属性(不用考虑他们的独立属性),但是这些属性值可能不相同

posted @ 2019-10-10 19:25  W文敏W  阅读(170)  评论(0编辑  收藏  举报