zoukankan      html  css  js  c++  java
  • 面向对象的三大特性

    一、继承

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

      继承是一种关系,描述两个对象之间,什么是什么的关系

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

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

    查看继承

    SubClass1.__bases__     #(<class '__main__.ParentClass1'>,)
    #__base__只查看从左到右继承的第一个子类,__bases__
    则是查看所有继承的父类
    
    如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,他提供了一些常见方法(如__str__)的实现。
    
    ParentClass1.__bases__
    (<class 'object'>,)

    抽象:

    不具体,不清晰,很模糊,看不懂

    将多个子类中相同的部分,进行抽取,形成一个新的类,这个过程也称为抽象的过程

    正确的使用继承:

      1.先抽象在继承

      2.继承一个已经现存的类,扩展或是修改原始的功能

    属性的查找顺序

    对象自己的 ---》所在类中 ---》找父类 ---》 父类的父类 ---》object

    class Animal:
    
        def __init__(self,name,aggr,life_value):
            self.name = name
            self.aggr = aggr
            self.life_value = life_value
    
        def eat(self):
            print('%s is eating'%self.name)
    
    
    class Dog(Animal):
        pass
    
    class Person(Animal):
        pass
    
    per = Person('yy',10,100)
    dog = Dog('uu',20,1000)
    per.eat()
    dog.eat()

    派生

    当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类,通常子类都会写一些新的代码,不可能和父类完全一样,即通常都是派生类,所以派生类值得就是子类。

    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)

    覆盖:

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

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

    class A:
        def hahaha(self):
            print('A')
    
    class B(A):
        def hahaha(self):
            super().hahaha()
            print('B')

    通过继承建立了派生类与基类之间的关系,它是一种‘是’的关系,比如白马是马,人是动物。

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

    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

    组合

    也是一种关系,描述两个对象之间,是什么有什么的关系

    例如,学生有手机,游戏中角色拥有某些装备

    将一个对象作为另一个对象的属性

    组合的目的:
      也是为了重用现有代码

      什么时候使用继承:分析两个类的关系,到底是不是:什么是什么的关系

      什么时候使用组合:如果两个类之间,没有太大的关系,完全不属于同类

      另外组合相比继承,耦合度更低了

    菱形继承

    新式类与经典类

    python3中任何类都是直接或间接继承了object

    新式类,任何显式或隐式地继承自object的类就称之为新式类,python3中都是新式类

    经典类,既不是object的子类,仅在python2中出现

    当出现菱形继承时,新式类,先深度,当遇到了共同父类时就广度

    经典类就是深度优先

  • 相关阅读:
    php的webservice的soapheader认证问题
    训练与解码
    ajax 图片上传
    js倒计时
    数据分析有价值的博客
    [Luogu P5675][GZOI2017]取石子游戏
    [BZOJ4558/LOJ2025/Luogu3271][GZOI2016/JLOI2016/SHOI2016]方
    [BZOJ4557/LOJ2024/Luogu3267][GZOI2016/JLOI2016/SHOI2016]侦察守卫
    PKUWC2019游记
    随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/KrisYzy/p/11246710.html
Copyright © 2011-2022 走看看