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())

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

Python之浅谈继承_第1张图片

在新式类中是广度优先

在经典类中是深度优先

重用父类方法

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

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列表找,现在想指名道姓的用某个父类的某个方法,就需要指名道姓的使用

转载于:https://www.cnblogs.com/MrYang161/p/11420296.html

你可能感兴趣的:(python,数据结构与算法)