zoukankan      html  css  js  c++  java
  • 继承

    一、继承的定义

      继承在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,'金毛')                       
    复制代码
  • 相关阅读:
    MAC 上找不到.bash_profile或者ect/profile该怎么办?
    iOS极光推送集成步骤
    排序算法
    iOS之内存管理浅谈
    iOS之多线程浅谈
    iOS之RunTime浅谈
    Hash算法初见
    webApi实现增删改查操作
    Python: sqlite3模块
    python3:iterable, iterator, generator,抽象基类, itertools的使用。
  • 原文地址:https://www.cnblogs.com/Ebola-/p/8324915.html
Copyright © 2011-2022 走看看