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

posted @ 2019-08-27 19:25  暗夜幻羽  阅读(175)  评论(0编辑  收藏  举报