zoukankan      html  css  js  c++  java
  • Python之浅谈继承

    继承

    继承介绍

    如何使用继承

    class 类名(父类1,父类2):
    pass
    概念:是一种新建类的方式,继承了一个类,类中的属性和方法就在子类中

    • 父类/基类
    • 子类/派生类
    新式类:只要继承了object类,就是新式类,再python3中,默认继承object类
    • Python3中:默认继承object
      class A:
      pass
    • python2中,需要显示的指定继承object
    经典类:没有继承object的类,就是经典类
    • python3中没有经典类
    • python2中才有

    利用继承减少代码冗余,菱形问题

    减少代码冗余
    class Public:#父类
            school ='electronic'
    
    
    class Teacher(Public):#子类
        def __init__(self, course_choice):
            self.course_choice = course_choice
    
    
    class Student(Public):#子类
        def __init__(self, name):
            self.name= name
    
    菱形问题
    class A(object):
        def test(self):
            print('from A')
    
    class B(A):
        def test(self):
            print('from B')
    
    class C(A):
        def test(self):
            print('from C')
    
    class D(B):
        def test(self):
            print('from D')
    
    class E(C):
        def test(self):
            print('from E')
    
    class F(D,E):
        # def test(self):
        #     print('from F')
        pass
    print(F.mro())
    

    [<class 'main.F'>, <class 'main.D'>, <class 'main.B'>, <class 'main.E'>, <class 'main.C'>, <class 'main.A'>, <class 'object'>]

    在新式类中是广度优先

    在经典类中是深度优先

    重用父类方法

    方法一:指名道姓的方式,跟继承关系无关

    class Person(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
    
    def init_1(self,name,age):
        self.name=name
        self.age=age
    
    class Student:
        school = 'yyyy'
        def __init__(self,name,age,course):
            #指名道姓的使用Person的__init__方法
            # Person.__init__(self,name,age)
            # init_1(self,name,age)
            self.course=course
    
    stu=Student('nick',19,'python')
    print(stu.name)
    

    方法二:通过super关键字,跟继承关系有关

    class Person(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
    class Student(Person):
        school = 'yyyy'
        def __init__(self,name,age,course):
            #super()相当于得到了一个特殊对象,第一个参数不需要传,调用绑定方法,会把自己传过去
            ##########    self不需要传,不需要传
            # super().__init__(name,age)
            #看到别人这么写:super(类名,对象)  在py3中为了兼容py2
            #在py3中这么写和省略写法完全一样
            #在py2中必须super(Student,self)写
            super(Student,self).__init__(name,age)
            self.course=course
    

    总结

    有继承关系的时候,通常用super,指名道姓的方式在什么情况下用?

    1.没有继承关系
    2.如果继承了多个父类,super是按照mro列表找,现在想指名道姓的用某个父类的某个方法,就需要指名道姓的使用

  • 相关阅读:
    meanshift聚类的实现
    birch聚类算法
    DBSCAN聚类算法的实现
    discrete adaboost的C++实现
    kd-tree的实现
    红黑树的实现——插入
    24位位图转8位灰度图
    将RGB数据写入BMP位图文件
    splay树的实现
    AVL树的实现
  • 原文地址:https://www.cnblogs.com/MrYang161/p/11420296.html
Copyright © 2011-2022 走看看