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中出现

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

    经典类就是深度优先

  • 相关阅读:
    JS通过组装key值访问json对象中的值
    js属性对象的hasOwnProperty方法
    ES6 去掉已经 new Date().format 方法
    Ajax不能接受php return值的原因
    CentOS最常用命令及快捷键整理
    js中for循环中需要调用异步方法,怎么确保执行的顺序?
    MYSQL 更新字段,向字段追加字符串
    java-学习2
    java-学习1
    JS----贪吃蛇游戏
  • 原文地址:https://www.cnblogs.com/KrisYzy/p/11246710.html
Copyright © 2011-2022 走看看