zoukankan      html  css  js  c++  java
  • 面向对象继承

    前言:

      继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

    python中的继承分为:单继承和多继承      

    class A():  #定义一个类
        pass
    class B():  #定义一个父类
        pass
    class C(A):  #单继承.基类是A,派生类是C
        pass
    class D(A,B):  #python支持多继承,用逗号分隔开多个 继承的类
        pass

    查看继承的方法

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

    说明:如果没有指定基类.python的类会默认继承object类.object是所有python类的基类,他是提供了一些常键方法(如__str__)的实现

    >>> ParentClass1.__bases__
    (<class 'object'>,)
    >>> ParentClass2.__bases__
    (<class 'object'>,)

    继承与抽象(先抽象在继承)

    抽象即取类似或者说比较像的部分

    抽象分成两个层次:

      1.将两个类中比较像的部分抽取出来.作为父类

      2.将两个对象比较像的部分抽取成类

    抽象最主要的作用是划分类别(可以格里尼关注点.降低复杂度)

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

    抽象只是根系和设计的过膝恒中,一个定做或者说一种技巧.通过抽象可以的到类

    继承的重用性

    class Animal:
        '''
        人和狗都是动物,所以创造一个Animal基类
        '''
        def __init__(self, name, aggressivity, life_value):
            self.name = name  # 人和狗都有自己的昵称;
            self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
            self.life_value = life_value  # 人和狗都有自己的生命值;
    
        def eat(self):
            print('%s is eating'%self.name)
    
    class Dog(Animal):
        '''
        狗类,继承Animal类
        '''
        def bite(self, people):
            '''
            派生:狗有咬人的技能
            :param people:  
            '''
            people.life_value -= self.aggressivity
    
    class Person(Animal):
        '''
        人类,继承Animal
        '''
        def attack(self, dog):
            '''
            派生:人有攻击的技能
            :param dog: 
            '''
            dog.life_value -= self.aggressivity
    
    egg = Person('egon',10,1000)
    ha2 = Dog('二愣子',50,1000)
    print(ha2.life_value)
    print(egg.attack(ha2))
    print(ha2.life_value)
    View Code

    注意: 对象之间属性的引用,会先从自己类中去寻找.然后再去父类去寻找.直到最顶级的父类

    在子类中,新建的重命名的函数属性,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,应该是用调用函数的方式,即:类名.func(),此时就与调用普通函数无异了.因此即便是self参数也要为其传值

    在python3中,子类执行父类的方法也可以直接用super方法

    class A:
        def hahaha(self):
            print('A')
    
    class B(A):
        def hahaha(self):
            super().hahaha()
            #super(B,self).hahaha()
            #A.hahaha(self)
            print('B')
    
    a = A()
    b = B()
    b.hahaha()
    super(B,b).hahaha()
    
    帮你了解super
    对super的用法
    class Animal:
        '''
        人和狗都是动物,所以创造一个Animal基类
        '''
        def __init__(self, name, aggressivity, life_value):
            self.name = name  # 人和狗都有自己的昵称;
            self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
            self.life_value = life_value  # 人和狗都有自己的生命值;
    
        def eat(self):
            print('%s is eating'%self.name)
    
    class Dog(Animal):
        '''
        狗类,继承Animal类
        '''
        def __init__(self,name,breed,aggressivity,life_value):
            super().__init__(name, aggressivity, life_value) #执行父类Animal的init方法
            self.breed = breed  #派生出了新的属性
    
        def bite(self, people):
            '''
            派生出了新的技能:狗有咬人的技能
            :param people:  
            '''
            people.life_value -= self.aggressivity
    
        def eat(self):
            # Animal.eat(self)
            #super().eat()
            print('from Dog')
    
    class Person(Animal):
        '''
        人类,继承Animal
        '''
        def __init__(self,name,aggressivity, life_value,money):
            #Animal.__init__(self, name, aggressivity, life_value)
            #super(Person, self).__init__(name, aggressivity, life_value)
            super().__init__(name,aggressivity, life_value)  #执行父类的init方法
            self.money = money   #派生出了新的属性
    
        def attack(self, dog):
            '''
            派生出了新的技能:人有攻击的技能
            :param dog: 
            '''
            dog.life_value -= self.aggressivity
    
        def eat(self):
            #super().eat()
            Animal.eat(self)
            print('from Person')
    
    egg = Person('egon',10,1000,600)
    ha2 = Dog('二愣子','哈士奇',10,1000)
    print(egg.name)
    print(ha2.name)
    egg.eat()
    人和狗

    通过继承建立了派生类与基类之间的关系,他是一种'是'的关系,比如白马是马,认识动物

    当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如教授是老师

    >>> class Teacher:
    ...     def __init__(self,name,gender):
    ...         self.name=name
    ...         self.gender=gender
    ...     def teach(self):
    ...         print('teaching')
    ... 
    >>> 
    >>> class Professor(Teacher):
    ...     pass
    ... 
    >>> p1=Professor('egon','male')
    >>> p1.teach()
    teaching
  • 相关阅读:
    1012 The Best Rank (25 分)(排序)
    1011. World Cup Betting (20)(查找元素)
    1009 Product of Polynomials (25 分)(模拟)
    1008 Elevator (20 分)(数学问题)
    1006 Sign In and Sign Out (25 分)(查找元素)
    1005 Spell It Right (20 分)(字符串处理)
    Kafka Connect 出现ERROR Failed to flush WorkerSourceTask{id=local-file-source-0}, timed out while wait
    flume、kafka、avro组成的消息系统
    Java23种设计模式总结【转载】
    Java编程 思维导图
  • 原文地址:https://www.cnblogs.com/LLBFWH/p/9995702.html
Copyright © 2011-2022 走看看