zoukankan      html  css  js  c++  java
  • day24,面向对象的原理和继承,重写

                                                                     面向对象的原理和继承,重写

    什么是面向对象编程

    面向对象编程就是 把具有 共性 的事务 抽象 成 属性和方法 来进行代码编程.

    什么是面向过程编程

    面向过程是具体化的,流程化的。解决一个问题,需要一步一步分析需要怎样,然后需要怎样,一步一步实现的

    为什么要面向对象编程

    编程(OOP)具有多方面的吸引力。对管理人员, 它实现了更快和更廉价的开发与维护过程。对分析与设计人员,建模处理变得更加简单,能生成清晰、易于维护的设计方案。对象模型显得如此高雅和浅 显。此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务。每个人都可从中获益,至少表面如此

    ## 类属性与对象属性
    
    类中应该仅存储所有对象共有的内容
    
    ​    如所有人的国籍相同那就放到类中
    
    对象中存储每个对象独有的内容
    
    ​    如每个人的名字都不同
    
    ## __init__方法的作用
    
    init 是初始化的缩写 用于为对象的属性设置初始值
    
    特点:
    
    ```
    # 执行时机:当实例化产生对象时会自动执行该函数
    # 会自动传入需要初始化的对象
    # 初始化必须包含至少一个参数 用于表示对象本身
    # 该函数不允许有返回值 必须为None
    ```
    
    
    ## 绑定方法
    
    绑定即两个东西绑在一起 
    
    方法就是函数  
    
    那就是说绑定方法 == 绑定函数
    
    默认情况下 在类中定义的方法 都是绑定方法
    
    绑定方法 是把函数和对象绑定到一起 
    
    为什么要绑定:
    
    每个应用程序其实本质上都是在处理数据,那就必须明确 要处理的数据在哪里,如何处理 
    
    绑定方法的好处在于,将需要处理的数据 以及处理数据的方法绑定在一起,这样一来 当你获得一个对象就同时获得 数据以及 相应的处理方法 ,简单的调用即可
    
    
    
    ### 绑定方法与普通函数的区别
    
    当使用类调用时,就是一个普通函数 有几个参数就得传几个参数
    
    当用对象来调用时,是一个绑定方法了,会自动将对象作为第一个参数传入
    
    
    
    一个类中可以有属性和方法 
    
    方法分为两种
    
    1.绑定方法
    
    ​    1.1对象绑定方法
    
    ​    在使用对象调用时会自动传入对象本身
    
    ​    1.2类绑定方法
    
    ​    @classmethod
    
    ​    在使用对象调用时会自动传入类本身
    
    ​    在使用类来调用时也会自动传入类本身
    
    ​    单例模式中就会经常使用@classmethod
    
    
    
    到底绑定给谁?
    
    当你的方法执行过程中需要使用到对象中数据时就绑定给对象
    
    当你的方法执行过程中需要使用到类中数据时就绑定给类
    
    
    
    2.非绑定方法
    
    即不需要对象中的数据 也不需要类中的数据  那就定义为非绑定方法,就是普通函数
    
    @staticmethod
    
    
    oop知识点:
    
    1.属性应该放在类中还是对象中 
    
    2.绑定方法  == 绑定函数 
    
    对象绑定方法
    
    ​    对象调用时 自动传入对象本身
    
    ​    类调用时不会自动传参 有几个就需要传几个 
    
    类绑定方法
    
    ​    @classmethod
    
    ​    无论是对象还是类调用 都会自动传入类本身 
    
    非绑定方法(静态方法)
    
    ​    @staticmethod
    
    ​    谁调用都不会自动传参 
    
    # 在使用面向对象编程时  首先要想的时 需要什么对象,这些对象具备什么样的属性和什么样的行为,根据属性和行为创建对应的类
    
    
    
    # 继承:
    
    继承指的是一种关系,在生活中通过继承关系,例如王思聪继承王健林,对于王思聪可以,可以直接使用王健林已经拥有的
    
    被继承的一方(王健林) 称之为父   继承的一方(王思聪) 称之为子
    
    在OOP中 继承描述是类和类之间的关系  例如b类继承a类  b类可以直接使用a类中的属性和方法 
    
    a是父类(基类,超类)  b是子类(派生类)
    
    好处:极大的提高了代码的复用性 
    
    
    
    如何使用继承,至少需要两个类
    
    语法:
    
    class 子类名称(父类名称):
    
    ​    pass
    
    ```python
    class Teacher:
        school = "oldboy"
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def say_hi(self):
            print("hello i am %s" % self.name)
            
        def teach(self):
            print("正在教书......")
    
    class Student(Teacher):
        pass
    
    print(Student.school)
    print(Student.say_hi)
    print(Teacher.say_hi)
    
    s = Student("rose","123")
    s.say_hi()
    s.teach()
    
    在上述案例中通过继承 学生就拥有了老师的所有内容  但是学生不应该教书这个技能
    意味着这个继承关系 有问题 不合理
    需要先抽象 在继承
    ```
    
    
    
    # 抽与继承
    
    继承之后可以直接使用父类的属性和方法 
    
    使用继承时 应该先抽象 在继承
    
    抽象指的是 将一系列类中相同的特征和相同行为抽取 形成一个新的类 
    
    会产生一些与原本业务不想关的类 
    
    站在不同角度会得到不同的抽象结果
    
    ![抽象过程](C:UsersdellDesktop抽象过程.png)
    
      案例:
    
    ```python
    # 抽象得到的公共父类
    class OldBoyPerson:
        school = "oldboy"
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def say_hi(self):
            print("hello i am %s" % self.name)
    
    class Teacher(OldBoyPerson):
        def teach(self):
            print("正在教书......")
    
    
    class Student(OldBoyPerson):
        pass
    
    
    # 测试
    t = Teacher("owen",38)
    t.say_hi()
    t.teach()
    
    s = Student("歌王",20)
    s.say_hi()
    
    ```
    
    # 在python3中任何类都直接或间接继承自Object   
    
    Object是所有类的基类 (根类)
    
    其中提供一系列方法, 这样一来 无论你是什么类 ,你都可以直接是object中已经存在的方法 
    一切皆对象
    
    一切皆对象指的是  在python中您所使用到的任何数据都是对象  int  float list dict 模块 包 函数
    
    
    
    # 属性的查找顺序 
    
    ```python
    #对象自己 - > 所在的类 -> 所在类的父类 -> 父类的父类  -> object
    class A:
        name = "scot"
        # def __str__(self):
        #     print("111111111")
        #     pass
        pass
    
    class B(A):
        name = "rose"
        pass
    
    b = B()
    # b.name = "jack"
    print(b.name)
    ```
    
    # 派生与覆盖
    
    子类拥有与父类不同的内容 就称之为派生类
    
    覆盖 指的是子类出现了与父类完全相同(属性/方法)名称  根据查找顺序  就会优先找子类的 即覆盖了父类的内容
    
    
    
    # 在子类中访问父类已有的方法或属性
    
    ```python
    
    class Person:
        text = "321"
        def __init__(self,name,age,gender):
            self.name = name
            self.age = age
            self.gender = gender
    
        def sleep(self):
            print("人类 午睡 躺着睡!")
    
        def say_hi(self):
            print("my name :%s my age :%s my gender: %s " % (self.name,self.age,self.gender),end="")
    
        
    class Student(Person):
        text = "123"
        def __init__(self,name,age,gender,number):
            #======================================================================重点在这里
            # 由于父类已经存在一个方法可以完成这个三参数的初始化
            # 所以可以直接调用父类的初始化完成这部分的初始化工作
            # 方法1
            # Person.__init__(self,name,age,gender) # 指名道姓的调用
    
            # 方法2  在py2中不支持
            super().__init__(name,age,gender)
    
            # py2的写法
            # super(Student, self).__init__(name,age,gender)
            self.number = number
            #======================================================================
    
        # 访问父类的属性
        def show_text(self):
            print(self.text)
            print(super().text)
    
        def say_hi(self):
            super().say_hi()
            print("my number: %s" %  self.number)
            # print("my name :%s my age :%s my gender: %s my number: %s" % (self.name, self.age, self.gender,self.number))
    
    
    s = Student("jack",20,"man","007")
    s.say_hi()
    # s.show_text()
  • 相关阅读:
    N皇后
    水域大小
    1221 分割平衡字符串
    1391 检查是否存在有效路径 DFS
    盛最多水的容器11 双指针
    烧饼排序
    每日日报8——软件设计④|抽象工厂模式(人与肤色)
    每日日报5——登录功能的实现(JAVA)
    每日日报4——软件设计②|简单工厂模式(女娲造人)
    vue利用transition过渡动画实现轮播图
  • 原文地址:https://www.cnblogs.com/WBaiC1/p/10878343.html
Copyright © 2011-2022 走看看