zoukankan      html  css  js  c++  java
  • day20继承

    1、继承

    继承是一种那类的方式,在python中支持一个儿子继承多个爹

    新建的类称为子类或者派生类,

    父类又可以称为基类或者超类

    子类会‘遗传‘父类的属性

    2、减少代码冗余

    继承是类与类之间的关系,寻找这种关系需要先抽象再继承

    class OldboyPeople:

      school='oldboy'

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

        self.name=name

        self.age=age

        self.sex=sex

    class OldboyTeacher(OldboyPeople)

        def change_score(self):

        print('%s老师修改成绩'%self.name)

    class Oldboystudent(OldboyPeople):

        def choose(self):

          print('%S学生选课'%self.name)

    属性查找

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

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

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

    obj=Bar()
    # print(obj.__dict__)
    obj.f2()
    先找本对象本身,没有去本身的类查找,找不到再去父类查找

    派生:子类定义自己新的属性,如果与父类同名,以子类自己为准
    class OldboyPeople:
    school = 'oldboy'

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

    def f1(self):
    print('爹的f1')
    class OldboyTeacher(OldboyPeople):
    def change_score(self):
    print('teacher %s is changing score' %self.name)

    def f1(self):
    print('儿子的f1')

    tea1 = OldboyTeacher('egon', 18, 'male')
    tea1.f1()
    
    
    在子类派生出的新方法中重用父类的功能
    方式一:指名道姓地调用(其实与继承没有什么关系的)
    方式二:super()调用(严格依赖于继承)
    super()的返回值是一个特殊的对象,该对象专门用来调用父类中的属性
    class OldboyPeople:
    school='oldboy'
    def __init__(self,name,age,sex):
    self.name=name
    self.age=age
    self.sex=sex
    def tell_info(self):
    print("""
    ===========个人信息==========
    姓名:%s
    年龄:%s
    性别:%s
    """ %(self.name,self.age,self.sex))


    class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,salary,level):
    # OldboyPeople.__init__(self,name,age,sex)
    super().__init__(name,age,sex)
    self.salary=salary
    self.level=level

    def change_course(self):
    print('%s修改成绩'%self)

    def tell_info(self):
    # OldboyPeople.tell_info(self)
    super().tell_info()
    print('''
    等级%s
    薪资%s
    '''%(self.salary,self.level))

    test1=OldboyTeacher('egon',18,'mail',3.1,9)
    print(test1)
    test1.tell_info()

    经典类与新式类
    1、新式类:
    继承object的类,以及该类的子类,都是新式类

    在python3中,如果一个类没有指定继承的父类,默认就继承object
    所以说python3中所有的类都是新式类

    2、经典类(只有在python2才区分经典类与新式类):
    没有继承object的类,以及该类的子类,都是经典类
    在菱形继承的背景下,查找属性
    1、经典类:深度优先
    2、新式类:广度优先
    class A:
        # def test(self):
        #     print('from A')
        pass
    
    class B(A):
        # def test(self):
        #     print('from B')
        pass
    
    class C(A):
        # def test(self):
        #     print('from C')
        pass
    class D(B):
        # def test(self):
        #     print('from D')
        pass
    
    class E(C):
        # def test(self):
        #     print('from E')
        pass
    
    class F(D,E):
        # def test(self):
        #     print('from F')
        pass
    # f1=F()
    # f1.test()
    
    # F->D->B->E->C-A->object
    
    print(F.mro())
    

     




    super()会严格按照mro列表从当前查找到的位置继续往后查找
    class A:
    def test(self):
    print('A.test')
    super().f1()
    class B:
    def f1(self):
    print('from B')
    class C(A,B):
    pass

    c=C()
    print(C.mro()) #C->A->B->object


    c.test()


  • 相关阅读:
    bzoj 2138: stone
    LOJ #6062. 「2017 山东一轮集训 Day2」Pair
    bzoj 5341: [Ctsc2018]暴力写挂
    UOJ #356. 【JOI2017春季合宿】Port Facility
    UOJ #357. 【JOI2017春季合宿】Sparklers
    UOJ #349. 【WC2018】即时战略
    bzoj 3600: 没有人的算术
    Codeforces 960G. Bandit Blues
    codeforces524E
    codeforces193B
  • 原文地址:https://www.cnblogs.com/lg04551/p/8807917.html
Copyright © 2011-2022 走看看