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

    继承

    什么是继承??

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

    在生活中例如王健林很有钱 但是王思聪开始是没有钱的 因为他爸是王健林 他继承了他爸的钱 所以他也有了钱.

    在程序中呢 描述的是类与类之间的关系,例如a继承了b 那么a就有b的特征 也就是a 能直接使用b已经存在的方法和属性 那么a称为 子类 ,b就是a的父类 也叫超类 和 基类

    那么为什么要使用继承呢???

    继承可以直接使用被继承 已存在的属性和方法 (目的是为了 减少代码的冗余 重用已经有了的代码 提高重用性)

    如何使用继承??

    # 语法
    class 类名称1: 
        name = '我是父类'
    
    # 定义子类
    class 类名称2(类名称1):
        pass
    # 在python中 一个子类可以同时继承多个父类
    # 如果你想调用 父类的 属性 那么 就和你掉 自己属性的语法是一样的
    res = 类名称2()
    print(res.name)
    >>> '我是父类'
    
    那么! 假如说 我子类中也有一个和父类一样的属性 或者 函数 那么 他会执行那个?
    class 类名称2(类名称1):
       name = '我是一个子类'
    
    # 查找顺序 如果自己有的话 就不和(老爸)父类 要了 如果没有 那么在找他要
    # 假如说 我一共有三个类 a 继承 b   b继承c  c继承d   那么a没有就会去b找 b没有的话就会去d找
    属性的查找顺序 
    class A:
        text = "haha"
    
    class B(A):
        text = "heihei"
        pass
    
    b = B()
    b.text = "xixi"
    
    print(b.text)
    先是对象自己的 然后 在类中找  不在就去父类中找....
    对象自己的 - > 所在类中 -> 找父类 - >父类的父类 ->Object
     
    

    什么是抽象?

    抽象就是 不具体的 很模糊的 看不懂的 他是一个将多个子类中相同的部分 进行抽取 形成一个新的类 这个过程就是抽象!

    例如

    # 有一个 类 是 老师和学生 
    class Teather:
        def __init__(self, name ,age):
            self.name = name
            self.age = age 
        def 技能(self):
            print('我会教书')
     class Student:
        def __init__(self, name ,age ,num ):
            self.name = name
            self.age = age 
            self.num = num
        def 技能(self):
            print('我会打游戏')
     # 他们都有公共的属性和方法 可以使用继承是吧,但是!  学生继承老师是不是很扯?凭什么继承他的名字?我会教书吗?对吧  所以 就需要使用抽象来创建一个新的类  因为 老师 和 学生 都有公共的属性 那么 我能不能定义一个人的类?? 然后 老师 和同学在继承人这个类???
    class Person:
        def __init__(self, name ,age):
            self.name = name 
            self.age = age
            
    class Teather(Person):
        def 技能(self):
            print('老子会教书')
    class Student(Person):
        def 技能(self):
            print('老子会打游戏') 
    

    派生

    哈哈 ,那么什么又是派生呢?python??不不不 其实派生就是 当一个子类出现了与父类不同的内容时 这个子类就称之为派生 通常会写一些新的代码 不可能和父类一模一样 ,所以派生列必须是子类

    覆盖

    什么是覆盖呢???哈哈哈 其实覆盖可以称为重写 英文单词 overrides

    当子类出现一个和父类名称完全一致的属性或者是方法 就是 覆盖

    子类中访问父类的内容

    语法(********)

    方式1:
    super(当前类名称,self).你要调的父类的属性或方法
    方式2:
    super().你要调的父类的属性或方法
    方式3:
    类名称.你要调的父类的属性或方法(self)  
    #方式3与继承无关
    # 这仅仅只是 子类访问父类的内容的方法
    
    #### 强调在强调:
    
    当你继承一个现有的类,并且你覆盖了父类的init方法时,必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数 
    例如:
    class Person:
        def __init__(self, name ,age):
            self.name = name 
            self.age = age
         def index(self):
            print('洗刷刷')
            
    class Teather(Person):
        def __init__(self,name):
            super().index()
            self.name = name
    
    

    组合

    组合 是一种关系 描述两个对象之间 什么有什么的关系 例如 学生有电脑 老师有手机 游戏有装备

    他是将一个对象作为另外一个对象的属性 (就是什么有什么)

    class Phone:
        def __init__(self,price,kind,color):
            self.price = price
            self.kind = kind
            self.color = color
    
        def call(self):
            print("正在呼叫XXXX;")
    
        def send_message(self):
            print("正在发送短信....")
    
    class Student:
        def __init__(self,name,gender,phone):
            self.name = name
            self.gender = gender
            self.phone = phone
    
        def show_info(self):
            print("name:%s gender:%s" % (self.name,self.gender))
    
    phone = Phone(1000,"apple","red")
    
    stu1 = Student("rose","male",phone)
    stu1.phone.call()
    
    
    ##### 组合的目的:
    
    也是为了重用现有代码
    
    
    什么时候使用继承:分析两个类的关系,到底是不是:什么是什么的关系 
    
    什么时候使用组合:如果两个类之间 没有太大的关系,完全不属于同类  
    
    另外组合相比继承,耦合度更低了 
    
    了解知识点
    ## 菱形继承
    首先明确python支持多继承
    ##### 补充:新式类与经典类
    python3中任何类都是直接或间接继承了Object 
    新式类,任何显式或隐式地继承自object的类就称之为新式类, python3中全都是新式类  
    经典类,既不是Object的子类 ,仅在python2中出现  
    当出现了菱形继承时,新式类,先深度,当遇到了共同父类时就广度 
    新式类,就是深度优先
    

    print(C.mor) 是一个打印出类的继承顺序

    1564072585171

    趁自己还没死 多折腾折腾
  • 相关阅读:
    Go:错误处理
    Go:闭包
    Go:内置函数
    Go:函数、defer
    mongodb 在PHP中常见问题及解决方法
    PHP 下载apk文件
    阿里云短信服务 PHP
    tp 创建文件并写入数据
    微信小程序中的加载更多(即列表分页)
    百度地图api逆地址解析 PHP
  • 原文地址:https://www.cnblogs.com/lddragon/p/11267387.html
Copyright © 2011-2022 走看看