• python之路_面向对象三大特性之继承


    一、继承的定义

      继承在python中是创建一种新类的方法,新建的类可以继承一个或者多个父类,其中父类称为超类或者基类,新建的类称为派生类或者子类。继承表达的是什么是什么的关系,如:高桌子低板凳都是木头,他大舅他二舅都是他舅。

    1、继承实例

      如下例,定义了两个类:Dog和Cat类,他们都其都有相同吃、喝、睡的特性。

    #
    class Dog:
        def eat(self):
            print('eating')
        def drink(self):
            print('drinking')
        def sleep(self):
            print('sleeping')
        def say(self):
            print('汪汪汪')
    
    #
    class Cat:
        def eat(self):
            print('eating')
        def drink(self):
            print('drinking')
        def sleep(self):
            print('sleeping')
        def say(self):
            print('喵喵喵')

      因为以上两类都有共同的方法,导致以上代码存在较多重复代码,因为以上两个类都是动物,故可以建立一个动物类,用继承的手段来创建这两个子类。可以解决代码的重复性。

    class Animal:                              #超类、基类
        def eat(self):
            print('eating)
        def drink(self):
            print('drinking')
        def sleep(self):
            print('sleeping')
    class Cat(Animal):                         #派生类、子类
        def say(self):
            print('喵喵')
    class Dog(Animal):                         #派生类、子类
        def say(self):
            print('汪汪')
    d=Dog()
    c=Cat()
    d.eat()
    c.eat()

    2、继承的分类

      继承一般分为单继承和多继承,具体格式如下:

    class ParentClass1:                            #定义父类
        pass
    
    class ParentClass2:                            #定义父类
        pass
    
    class SubClass1(ParentClass1):                 #单继承,基类是ParentClass1,派生类是SubClass1
        pass
    
    class SubClass2(ParentClass1,ParentClass2):    #python支持多继承,用逗号分隔开多个继承的类
        pass

      查看继承父类的方法如下:

    print(SubClass1.__base__#输出结果:(<class '__main__.ParentClass1'>,),__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
     print( SubClass2.__bases__#输出结果:(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>) 

    二、继承的应用

    1、对象可以调用自己本类和父类的所有方法和属性, 先调用自己的 自己没有才调父类的。谁(对象)调用方法,方法中的self就指向谁

    class A:
        def get(self):
            self.say()
    
        def say(self):
            print('AAAAA')
    
    class B(A):
        def say(self):
            print('BBBBB')
    
    b = B()
    b.get()   #输出结果为:BBBBB

    2、如果要优先使用父类该方法的功能 需要借助super方法,实例如下:

    class Animal:
        def __init__(self,name,food):
            self.name = name
            self.food = food
            self.family = '刘老师家'
        def eat(self):
            print('%s 吃 %s'%(self.name,self.food))
    class Dog(Animal):
        def __init__(self,name):
            super().__init__(name, '狗粮')   #优先使用父类init方法
            self.family = '景弘家'
        def swim(self):
            print('%s is swimming'%self.name)
    class Bird(Animal):
        def fly(self):
            print('%s is flying'%(self.name))
    
    teddy = Dog('熊二')                      #按照自己init方法要求穿参
    好鸟 = Bird('花姑娘','虫子')              #自己没有init方法,按照父类传参
    teddy.eat()                             #熊二 吃 狗粮
    teddy.swim()                            #熊二 is swimming
    print(teddy.family)                     #景弘家
    print(好鸟.family)                       #刘老师家

      经典类调用父类中的方法和新式类调用父类中的方法:

    class Animal:
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print('%s eating %s'%(self.name,self.food))
        def drink(self):
            print('drinking')
        def sleep(self):
            print('sleeping')
    
    class Dog(Animal):
        def __init__(self,name):
            Animal.__init__(self,name)    #经典类的调用父类中方法的方式
            self.food = '狗粮'
        def say(self):
            print('汪汪汪')
    
    class Cat(Animal):
        def __init__(self,name):
            super().__init__(name)        #新式类调用父类中方法的方式,等价于super(Animal,self).__init__(name)
            self.food = '猫粮'
        def say(self):
            print('喵喵喵')
    
    wang = Dog('alex')
    ha2 = Dog('二哈')
    wang.eat()                      #alex eating 狗粮
    ha2.eat()                       #二哈 eating 狗粮
    c = Cat('egon')
    c.eat()                         #egon eating 猫粮

    3、派生属性与派生方法实例

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

    class Animal:                        #父类 超类 基类
        def __init__(self,name,blood,aggr):
            self.name = name
            self.blood = blood
            self.aggr = aggr
    
        def eat(self):
            print('%s is eating' % self.name)
    
    class Person(Animal):                 #Person是子类
        def __init__(self, name, blood, aggr,RMB):
            super(Person, self).__init__(name,blood,aggr)
            self.qian=RMB
    
        def attack(self,dog):
            dog.blood -= self.aggr
    
    class Dog(Animal):                     #Dog是子类
        def __init__(self, name, blood, aggr, pinzhong):
            super().__init__(name,blood,aggr)
            self.breed= pinzhong           #派生属性
    
        def bite(self,person):             #派生方法
            person.blood -= self.aggr
    
    alex  = Person('alex',250,12,1000000)                  
    egg = Dog('egg',25000,20,'金毛')                       
  • 相关阅读:
    SpringBoot HATEOAS用法简介
    犀函
    dubbo 相关面试题 有用(转)
    想使用消息队列,先考虑下这些问题!
    appium在Mac上环境搭建
    3. SOFAJRaft源码分析— 是如何进行选举的?
    Redis相关知识
    替代微信ipad协议(转)
    c#面试题(1)(转)
    例题6-5 Boxes in a line uVa12657
  • 原文地址:https://www.cnblogs.com/seven-007/p/7544547.html
Copyright © 2020-2023  润新知