zoukankan      html  css  js  c++  java
  • 继承与派生

    一、继承

    1.什么是继承?

      

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

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

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

    子类会"遗产"父类的属性

    2.为什么要使用继承

    减少代码冗余

    3怎么用继承

    class ParentClass1:    #父类
            pass
    
    class ParentClass2:      #父类
            pass
    
    class Subclass1(ParentClass1):  #子类
        pass
    
    class Subclass2(ParentClass1,ParentClass2):
        pass
    
    print(Subclass1.__bases__)      #.__bases__# 类所有父类构成的元组(在讲继承时会讲)
    print(Subclass2.__bases__)
    View Code

    二、寻找继承关系

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

    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('teacher %s is changing score' %self.name)
    
    class Oldboystudent(OldboyPeople):
        def choose(self):
            print('student %s choose course' %self.name)
    
    
    tea1 = OldboyTeacher('egon', 18, 'male') #OldboyTeacher.__init__(...),调用类产生一个对象
    stu1=Oldboystudent('alex',73,'female')           
    
    print(tea1.name,tea1.age,tea1.sex)             #通过对象的名称空间指向类中的名称空间中的名字,打印出我们老师的特征信息
    # print(stu1.name)
    

    三、基于继承再看属性查找

    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)
    
    tea1 = OldboyTeacher('egon', 18, 'male') #
    # print(tea1.__dict__)             #打印对象的特征字典=》{'name': 'egon', 'age': 18, 'sex': 'male'},对象/类名.__dict__# 类/对象的字典属性
    # print(tea1.name)                #打印对象的名字属性=》egon
    # print(tea1.school)              #=》oldboy
    # print(tea1.change_score)            #累的一种绑定方法 =》<bound method OldboyTeacher.change_score of <__main__.OldboyTeacher object at 0x0000000001E7EF98>>
    print(tea1.f1)                        #先从自己查找 ,自己没有到自己的类中进行查找,没有到父类中查找
                                          # <bound method OldboyPeople.f1 of <__main__.OldboyTeacher object at 0x00000000021CEF98>>
    

    继承的属性查找

    class Foo:
        def f1(self):
            print('Foo.f1')
    
        def f2(self): #self=obj
            print('Foo.f2')
            self.f1() #obj.f1(),不会就近调用父类中的f1,而是调用子类中的f1
    
    class Bar(Foo):
        def f1(self):
            print('Bar.f1')
    
    obj=Bar()      #调用的类没有传参
    print(obj.__dict__)         #打印的是一个空字典
    obj.f2()               #继承的属性查找=》Foo.f2》》Foo.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.change_score()                   #通过对象的名称空间中的名字name,指向类中的名称空间的名字change_score ,=>>teacher egon is changing score
    tea1.f1()
    

     五、经典类与新式类

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

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

    2、经典类(只有在python2才区分经典类与新式类):
    没有继承object的类,以及该类的子类,都是经典类
    '''
    # print(object)
    
    class Foo(object):
        pass
    
    class Bar(Foo):
        pass
    
    # print(Foo.__bases__)
    print(Bar.__bases__)
    

      

  • 相关阅读:
    第k短路
    Codeforces Round #608 (Div. 2)
    Codeforces Round #606 E(无向图求pair(x,y)x到y的任意路径一定经过定点a和b的数量)
    Codeforces Round #603 (Div. 2)E
    题解报告:hdu 2717 Catch That Cow(bfs)
    题解报告:poj 3669 Meteor Shower(bfs)
    题解报告:poj 1321 棋盘问题(dfs)
    题解报告:hdu 1312 Red and Black(简单dfs)
    题解报告:poj 1426 Find The Multiple(bfs、dfs)
    hdu 4704 Sum(扩展欧拉定理)
  • 原文地址:https://www.cnblogs.com/sui776265233/p/8807622.html
Copyright © 2011-2022 走看看