面向对象-继承

1、初识继承
2、继承与抽象
3、派生
4、继承实现原理
5、总结

(代码中加注释)

1、初识继承

我们前面都学习过面向对象对不对,学习过都知道在写程序的时候使用面向对象会使得我们这个程序的拓展性比较高。
那今天呢就带着大家来了解一下为什么它的拓展性会比较高,到底高在那些地方
就来了解一下它的三大特性之一的继承

首先还是素质三连

  • 什么是继承?

继承是一种新建类的方式,新建的类叫做子类、也叫做派生类
继承我们先从字面意思来看,继承是不是就是儿子继承爹,在Python当中支持一个儿子继承多个爹,但是在Java中就没有这样的特性,Java中一个子类就只能继承一个父类.
父类也可以称为超类或是基类.
子类可以"遗传"父类的属性,可以通过这种方式解决代码重用的问题

  • 为什么要用继承?

减少代码冗余

  • 怎么用继承?
class Father1:
    pass

class Father2:
    pass

class Son1(Father1):
    pass

class Son2(Father1,Father2):
    pass

print(Son1.__bases__)

print(Son2.__bases__)

这个就可以看到它的基本的继承关系

2、继承和抽象

怎样寻找继承关系?

先找自己,再找类,最后父类,依次往上

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

抽象:抽取相似的部分

继承:就是基于抽象的结果,然后通过编程语言去实现它,肯定需要先经历抽象这个过程,才能通过继承的方式来表达出抽象的结构

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


class Teacher(Person):
    # def __init__(self,name,age,sex):
    #     self.name = name
    #     self.age = age
    #     self.sex = sex

    def teach(self):
        print("teacher %s teach student"%self.name)


class Student(Person):
    # def __init__(self,name,age,sex):
    #     self.name = name
    #     self.age = age
    #     self.sex = sex

    def study(self):
        print("student %s study"%self.name)

teacher = Teacher('sean',18,'male')

student = Student('yang',20,'male')

teacher.teach()

student.study()

3、派生

子类可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的点就是,当重新定义了自己的属性且与父类重名的时候,n那么调用新增的属性的时候就以自己为主了

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

    def foo(self):
        print("父类的功能")


class Teacher(Person):
    # def __init__(self,name,age,sex):
    #     self.name = name
    #     self.age = age
    #     self.sex = sex

    def teach(self):
        print("teacher %s teach student"%self.name)

    def foo(self):
        print("子类的功能")

teacher = Teacher('sean',18,'male')

teacher.foo()

子类中派生出的新方法重用父类的功能

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

    def foo(self):
        print("父类的功能")

class Teacher(Person):
    def __init__(self,name,age,sex,level):
        # self.name = name
        # self.age = age
        # self.sex = sex
        Person.__init__(self,name,age,sex)
        # super().__init__(name,age,sex)
        self.level = level

    def teach(self):
        print("teacher %s teach student"%self.name)

    def foo(self):
        print("子类的功能")

teacher = Teacher('sean',18,'male',10)

teacher.foo()
  • 1、父类类名+父类方法
    指名道姓调用与继承没有关系,任何一个类都可以这样操作
  • 2、super()
    super()的返回值是一个特殊的对象,该对象专门用来调用父类中的属性

4、继承实现原理

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):
    pass
f1=F()

print(F.mro())

5、总结

1、继承

继承是一种新建类的方式
新建的类称为子类或者是派生类
父类称为基类活超类

python中的继承支持一个子类同时继承多个父类

2、如何查找继承关系

  • 先抽象
    • 抽象对象之间相似之处得到了类
    • 再总结类与类之间的相似得到父类
  • 再继承
    • 子类继承父类,子类可以遗传父类的属性

3、属性查找

  obj.x
  1、先从obj.__dict__
  2、对象的类.__dict__
  3、父类.__dict__
  

4、派生
子类定义的名字会覆盖父类的同名属性

class Father:
    x = 1
    def f1(self):
        print('from father')
class Son(Father):
    y = 2
    def f1(self):
        print('from son')
posted @ 2019-07-25 18:03  Sean_Yang  阅读(132)  评论(0)    收藏  举报