zoukankan      html  css  js  c++  java
  • day24

    今日内容

    继承介绍

    以及继承的基本用法

    继承

      什么是继承?

        是一种新建类的方法,新建的类叫子类/派生类,被继承的类叫父类/基类/超类

        特点:

          1、子类遗传/继承父类的属性

          2、一个子类可以继承多个父类

          3、在继承的背景下,子类分为两种:新式类、经典类

          注:python2中会区分,在python3中所有类都默认继承object,所以在python3中所有类都是新式类

          经典类:没有继承object的类,以及该类的子类……都叫经典类

          新式类:就是继承了object的类,以及该类的子类……都叫新式类

         使用继承这种方式的好处:可以大大减少代码冗余

    #########################################################

    class Parent1(object):
    pass

    class Parent2(object):
    pass

    class Sub1(Parent1):#sub1继承了parent1
    pass

    class Sub2(Parent1,Parent2):#sub2继承了parent1和parent2
    pass

    print(Parent1.__bases__)#__bases__可以查看改类继承了那些类
    print(Parent2.__bases__)
    print(Sub1.__bases__)
    print(Sub2.__bases__)

    #########################################################

    利用继承可以解决代码之间的冗余

    首先,需要抽象出该父类下的子类的相同点,

    然后,在父类中的__init__设置好子类的相同属性(因为子类可以公用父类的这些属性)

    最后,再派生出一个个子类。

    ############################################################

    class 动物:

      def 吃(self):

       pass 

      def 喝(self):

       pass 

      def 拉(self):

       pass 

      def 撒(self):

       pass 

    class 狗(动物):

      def 叫声:

        print(‘汪汪汪’)

    class 猫(动物):

      def 叫声:

        print(‘喵喵喵’)

    ##############################################################

    在子类的派生的新方法中,重用父类的功能方式一:

      指名道姓的使用某一类中的函数

    总结:

    1、与继承无关

    2、访问类的函数,没有自动传值的效果

    ##########################################

    class zjnu:
    school = 'zjnu'

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

    class Student(zjnu):
    def __init__(self, name, age, sex, score=0):
    zjnu.__init__(self,name,age,sex)
    self.score = score


    class Teacher(zjnu):
    def __init__(self,name,age,sex,level):
    zjnu.__init__(self,name,age,sex)
    self.level=level

    ##################################################

    在单继承的背景下,属性查找的优先级

    对象==>对象的类==>父类==>父类……

    #####################################################

    class Foo:
    def f1(self):
    print('Foo.f1')

    def f2(self):
    print('Foo.f2')
    self.f1() #obj.f1()

    class Bar(Foo):
    def f1(self):
    print('Bar.f1')

    obj=Bar()
    obj.f2()
    '''
    Foo.f2
    Bar.f1
    '''

    #####################################################

    在多继承的背景下,属性查找的优先级:

    如果一个子类继承多个分支(多个子类没有共同继承一个非object的类)

    此时属性查找的优先级:对象==>对象的类==>从左到右的顺序一个一个按照分支查找

    ############################################################

    # 第四层:
    class G:
    # x = 'G'
    pass

    # 第三层
    class E(G):
    # x = 'E'
    pass

    class F:
    # x = 'F'
    pass

    # 第二层
    class B(E):
    # x = 'B'
    pass

    class C(F):
    # x = 'C'
    pass

    class D:
    # x = 'D'
    pass

    # 第一层
    class A(B, C, D):
    # x = 'A'
    pass

    obj = A()
    # obj.x = 111
    print(obj.x)

    ##############################################################

    菱形查找问题:

    新式类:一个个按照从左到右的顺序查找,最后再查找顶级类

    经典类:一个个按照从左到右的顺序查找,直接查找到顶级类

    python专门为新式类内置了一个mro的方法,用来查看c3算法(属性查找的规律的一种算法)的计算结果

      在子类派生的新方法中重用父类功能的方式二:

      在python2中:super(自己的类名,自己的对象)

      在python3中:super()

      调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性(完全参照mro列表)

      总结:

        1、严格依赖继承的mro列表

        2、访问时绑定方法,有自动传值的效果

    ##############################################################

    class zjnu:
    school = 'zjnu'

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

    class Student(zjnu):
    def __init__(self, name, age, sex, score=0):
    super(Student,self).__init__(name,age,sex)
    self.score = score

    class Teacher(zjnu):
    def __init__(self,name,age,sex,level):
    super().__init__(name,age,sex)
    self.level=level
    stu1=Student('lay',38,'male')
    print(stu1.__dict__)

    tea1=Teacher('ybg',88,'male',10)
    print(tea1.__dict__)

    #############################################################

  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/yaoxiaofeng/p/9506855.html
Copyright © 2011-2022 走看看