zoukankan      html  css  js  c++  java
  • 类的继承和组合

    继承

    什么是继承

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

    例如麦兜,佩奇,猪刚鬣 都是猪啊,

    在程序中,继承描述的是类和类之间的关系

    例如a继承了b, a就能直接使用b已经存在的方法和属性

    a称之为子类,b称之为父类,也称之为基类

     

    为什么要使用继承:

    继承的一方可以直接使用被继承一方已经有的东西

    其目的是为了重用已经有的代码,提高重用性

     

    如何使用继承

    语法:

    class 类名称(父类的名称):
        类的内容 
        
    #在python中 一个子类可以同时继承多个父类 
    class Base:
        desc = "这是一个基类"
    
        def show_info(self):
            print(self.desc)
    
        def make_money(self):
            print("一天赚一个亿...")
    
    #指定父类位Base
    class SubClass(Base):
        pass
    
    
    obj = SubClass()
    #即使类中什么都没有也可以使用父类中已有的内容
    obj.make_money()
    print(obj.desc)

     

    抽象:

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

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

    正确的使用继承:

    1.先抽象在继承

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

     

    属性的查找顺序

    class A:
        text = "haha"class B(A):
        text = "heihei"
        pass
    ​
    b = B()
    b.text = "xixi"print(b.text)

    对象自己的 - > 所在类中 -> 找父类 - >父类的父类 ->Object

    派生

    当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类

    通常子类都会写一些新的代码,不可能和父类完全一样 , 既通常都是派生类,

    所以派生类指的就是子类

    覆盖

    也称之为重写 overrides

    当子类出现了与父类名称完全一致的属性或是方法

     

    练习:

    实现一个可以限制元素类型的容器 (字典,列表,元组,集合,字符串)

     

    子类中访问父类的内容

    语法:

    方式1:
    super(当前类名称,self).你要调的父类的属性或方法
    方式2:
    super().你要调的父类的属性或方法
    方式3:
    类名称.你要调的父类的属性或方法(self)  
    #方式3与继承无关

     

    强调在强调:

    当你继承一个现有的类,并且你覆盖了父类的init方法时,必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数

     

    组合

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

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

    将一个对象作为另一个对象的属性,(既什么有什么)

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

     

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

    新式类,就是深度优先

  • 相关阅读:
    Java基础——clone()方法浅析
    Unity shader error: “Too many texture interpolators would be used for ForwardBase pass”
    ar 解压一个.a文件报错: xxx.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
    How to set up "lldb_codesign" certificate!
    Unity-iPhone has Conflicting Provisioning Settings
    ETC1/DXT1 compressed textures are not supported when publishing to iPhone
    Xcode 提交APP时遇到 “has one iOS Distribution certificate but its private key is not installed”
    XCode iOS之应用程序标题本地化
    苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置
    Unity 4.7 导出工程在XCode10.1上编译报错
  • 原文地址:https://www.cnblogs.com/wkq0220/p/11247229.html
Copyright © 2011-2022 走看看