美文网首页python
Python--面向对象特征2一继承

Python--面向对象特征2一继承

作者: 李菜菜同学 | 来源:发表于2021-03-28 16:09 被阅读0次

    一、继承简介

    1.有一个类,能够实现我们需要的大部分功能,但是不能实现全部的功能,如何能让这个类来实现全部的功能?

    ①直接修改这个类,在这个类中添加我们需要的功能;

    但是修改起来比较麻烦,会违反ocp原则

    ②直接创建一个新的类

    但是创建一个新的比较麻烦,需要大量的复制粘贴,会出现大量的重复性代码

    ③直接从animal类中继承它的属性和方法

    2.什么是继承?

    --继承是面向对象的三大特性之一

    --通过继承我们可以使一个类获取到其它类中的属性和方法

    --在定义类的时候,可在类名后的括号中指定当前类的父类(超类、基类、super)

     子类(衍生类)可以直接继承父类中的所有属性和方法。

    通过继承可以直接让子类获取到父类的方法或属性,避免编写重复性的代码,并且也符合ocp原则,所以我们经常需要通过继承来对一个类进行扩展。

    注意:在创建类的时候,如果省略了父类,则默认父类为object。所有的类都是object的子类。

    #继承

    #定义一个Animal的类

    #这个类中2个方法

    class Animal:

    def run(self):

    print('动物会跑~~~~ ')

    def sleep(self):

    print('动物睡觉~~~~')

    #定义一个Dog类

    class Dog(Animal):

    def bark(self):

    print('汪汪汪---')

    #d既是dog的实例也是animal的实例

    d = Dog()

    #issubclass()检查一个类是否是另一个类的子类

    print(issubclass(Dog,Animal))

    #isinstance()用来检查一个对象是否是一个类的实例

    #如果这个类是这个对象的父类,也会返回True

    #所有的类都是object的子类

    print(isinstance(Animal,object))

    图示

    二、方法的重写

    --如果在子类中如果有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们叫做方法的重写(覆盖,override)

    class Animal:

    def run(self):

    print('动物会跑~~~~ ')

    def sleep(self):

    print('动物睡觉~~~~')

    #定义一个Dog类

    class Dog(Animal):

    def bark(self):

    print('汪汪汪---')

    def run(self):

    print('狗狗会跑@@@@')

    #创建dog类的实例

    d=Dog()

    d.run()

    图示

    注意:当我们调用一个对象的方法时,会优先去当前对象中寻找是否具有该方法,如果有则直接调用;如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法,如果没有,则去父类的父类中寻找,以此类推,直到找到object,如果object也没有,则报错。

    三、super

    父类中的所有方法都会被子类继承,包括特殊方法,也可以重写特殊方法。

    class Animal:

    #特殊方法init

        def __init__(self,name):

    self.__name = name

    #设置name的getter和setter方法

            @property

            def name(self):

    return self.__name

    @name.setter

            def name(self,name):

    self.__name = name

    def run(self):

    print('动物会跑~~~~ ')

    def sleep(self):

    print('动物睡觉~~~~')

    #定义一个Dog类

    class Dog(Animal):

    #重写特殊方法init

        def __init__(self,name,age):

    self.__name = name

    self.__age = age

    #设置age的getter和setter方法,name已经在父类中设置过了

        @property

        def age(self):

    return self.__age

    @age.setter

        def age(self):

    self.__age = age

    def bark(self):

    print('汪汪汪---')

    def run(self):

    print('狗狗会跑@@@@')

    #创建dog类的实例

    d=Dog('常狗',26)

    d.name ='小黑'

    print(d.name)

    print(d.age)

    图示

    虽然子类可以重写父类的特殊方法,但是将父类的全部方法写入,会有些麻烦。

    super()可以用来获取当前类的父类,并且通过super()返回对象调用父类方法时候,不需要传递self。

    图示

    四、多重继承

    __类名.__bases这个属性可以用来获取当前类的所有父类

    class A(object):

    def test(self):

    print('AAAAA')

    class B(A):

    def test(self):

    print('BBBBB')

    class C(B):

    def test(self):

    pass

    print(C.__base__)#输出(<class '__main__.B'>,)

    在python中支持多重继承的,也就是一个类可以同时指定多个父类

    --可在类名的()后边添加多个类,来实现多重继承

    --多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法

    注意:在开发中没有特殊情况,应该避免多重继承,因为多重继承会让我们的代码过于复杂。如果多个父类中有同名的方法,则会先在第一个父类中去寻找,然后找第二个第三个。前边的会覆盖后面的。

    class A(object):

    def test(self):

    print('AAAAA')

    class B(object):

    def test2(self):

    print('BBBBB')

    class C(A,B):

    pass

    print(C.__base__)#输出(,)

    c = C()

    c.test()

    c.test2()

    图示

    相关文章

      网友评论

        本文标题:Python--面向对象特征2一继承

        本文链接:https://www.haomeiwen.com/subject/uyfeqltx.html