• 学习笔记-Python基础9-面向对象编程OOP


    一、面向对象ObjectOriented:条理构成功能的元素,组建模型

      OO:面向对象

      OOA:面向对象的分析

      OOD:面向对象的设计

      OOI:面向对象的实现

      OOP:面向对象的编程

      OOA->OOD->OOI:面向对象的实现过程

      类和对象的区别:

        类:抽象名词,代表一个集合里面共性的事物,一大类事物

        对象:具象的事物,单个个体,代表的是一类事物的某个个体,比如类的实例

      类里面应该有两块内容:

        1、属性(变量):表明事物的特征,一般用名词

        2、成员方法(函数):表明事物的功能或动作

    二、类的基本实现

      命名规范:1、遵循变量命名规范;2、大驼峰写法;3、避开系统关键字以及和关键字相似的命名

      声明:1、使用class关键字;2、内部右属性和方法构成,比如不允许使用for,for必须写到方法里面;3、成员属性定义可以直接使用变量赋值,如果不赋值,建议使用None

    三、anaconda基本使用

      anaconda主要是一个虚拟环境管理器,还是一个安装包管理器

      conda list:显示anaconda安装的包

      conda env list:显示anaconda的虚拟环境列表

      conda create -n xxx python=3.6:创建一个名称为xxx的python3.6版本的虚拟环境

     1 '''
     2 定义一个学生类
     3 '''
     4 class student():
     5     pass
     6 #定义一个对象
     7 mingyue = student()
     8 '''
     9 定义一个学python的学生类
    10 '''
    11 class PythonStudent():
    12     name = None
    13     age = 18
    14     course = "Python"
    15     def doHomework(self):
    16         print("I 在做作业")
    17         return None #函数末尾推荐使用return语句,即便无返回值,可以写None
    18 yueyue = PythonStudent()
    19 print(yueyue.name,yueyue.age)
    20 yueyue.doHomework()
    21 print(yueyue.__dict__,PythonStudent.__dict__) #打印对象下的所有成员(属性+方法)和类下的所有成员

     上面代码打印如下:

     四、类和对象的成员分析

      1、类和对象都可以存储成员,成员可以归类所有,也可以归对象所有

      2、类存储成员时使用的是与类关联的一个对象

      3、独享存储成员是存储在当前对象中

      4、对象访问一个成员,优先寻找对象下的成员,如果没有,才去找类中同名成员

      5、类实例的属性和其对象实例的属性,在不对对象实例属性赋值的前提下,指向同一个变量;

        创建对象的时候,类中的成员不会放入对象当中,而是得到一个空对象,没有成员;

        通过对象对类中成员的重新赋值或者通过对象添加成员时,对应的成员会保存在对象中,而不修改类成员;举例如下:

      

    五、self

         self在对象方法中表示当前对象本身,如果通过对象调用一个方法,self会自动传入到当前方法的第一个参数

       self并不是关键字,只是一个用于接收对象的普通参数,理论上可以用任何一个普通变量名代替

      方法中有self形参的方法叫做非绑定类的方法,可以通过对象访问,没有self参数的方法叫做绑定类的方法,只能通过类访问

      访问类的成员变量,通过__class__.成员名来访问,举例如下:

      

    六、面向对象的三大特性:封装、继承、多态

      1、封装:就是对对象成员进行访问限制

            封装的三个级别:公有的public、受保护的protected、私有的private,它们3个不是关键字

          对象的位置:对象内部、对象外部、子类中

             私有的private:私有成员是最高级别的封装,只能再当前类或对象中访问

                    在成员前面添加两个下划线表示

               Python的私有不是真私有,是一种name mangling的改名策略(用__dict__将类所有成员打印出来可以看到在类中写成私有的__成员,改名成了_类名__成员)

               

           公共的public:成员前面不做任何添加,默认共有的

           受保护的protected:是将对象成员进行一定级别的封装,然后,在类中或者子类中都可以进行访问,但是外部不可以

                     写法:在成员名称前面添加一个下划线

               2、继承:就是一个类可以获得另外一个类中的成员属性和成员方法

             作用:减少重复代码,增加代码复用性,同时可以设置类与类之间的关系

             继承和被继承的概念:

              被继承的类称为父类,也叫基类,也叫超类

              用于继承的类称为子类,也叫派生类

              继承和被继承一定存在一个 is-a 关系(This is a xxx)

              语法:继承类的参数中填入被继承的类名

              

            继承的特征:所有的类都继承自object类,即所有的类都是object类的子类

                  子类一旦继承父类,则可以使用父类中除私有成员外的所有内容

                  子类继承父类后并没有将父类成员完全赋值到子类中,而是通过引用关系访问调用

                  子类可以定义独有的成员属性和方法

                  子类中定义的成员和父类成员如果同名,则优先使用子类成员

                  子类如果想扩充父类的方法,可以再定义新方法的同时访问父类的成员进行代码重用,写法:父类名.父类成员的格式来调用父类成员,也可以使用super().父类成员来调用

                  

            继承变量函数的查找顺序:

              优先查找自己的变量,没有则继续往上(父类)查找

              构造函数如果本类中没有定义,则自动查找调用父类构造函数,如果本类中有定义,则不继续向上查找

            构造函数:

              是一类特殊的函数,在类进行实例化之前调用

              如果定义了构造函数,则实例化的时候使用此构造函数,而不查找父类构造函数,如果没定义构造函数,则自动向上查找父类构造函数

              如果子类没有定义构造函数,而父类的构造函数带参数,则实例化子类时,应该按按父类构造函数参数传参

              

            super:不是一个关键字,而是一个类

                 super作用是获取MRO(MethodResolustionOrder)方法解析顺序列表中的第一个类,而这个类往往就是它的父类,和父类没有任何实质性关系

                 用super()调用父类的初始化构造函数

               

               

             单继承和多继承

              单继承:每个类只能传承一个类

              多继承:每个类允许继承多个类

              

              二者优缺点:

                单继承优点:传承有序、逻辑清晰、语法简单、隐患少

                   缺点:功能不能无限扩展,只能在当前唯一的继承链中扩展

                多继承优点:类的功能扩展方便

                   缺点:继承关系混乱

              菱形继承/钻石继承问题 :

                多个子类继承自同一个父类,这些子类又被同一个类继承,于是继承关系图形成了一个菱形图谱 

                关于多继承的MRO:

                  MRO就是多继承中,用于保存继承顺序的一个列表
                  Python本身采用C3算法来计算多继承的菱形继承进行计算得出结果

                  MRO列表的计算原则:

                    子类永远在父类前面

                    如果多个父类,则根据继承语法中括号内内的书写顺序存放
                    如果多个类继承了同一个父类,孙子类中只会选取继承语法括号中写的第一个父类的父类 

                  

         3、多态(课外知识之java中解释:一个函数由于函数签名不同,可以有不同函数存在,同一个名,调用的时候根据函数签名不同,自动找到相应函数执行)

         同一个对象在不同情况兄下有不同状态出现

         Python中多态不是语法,而是一种设计思想

         多态性:一种调用方式,产生不同的执行效果

         多态:同一事物的多种形态

         1、Mixin设计模式

          主要采用多继承方式对类的功能进行扩展

          我们使用多继承语法来实现Mixin,因此使用Mixin实现多继承的时候要非常小心

            首先它必须表示某一单一功能,而不是某个物品

            功能职责必须单一,如果有多个功能,则写多个Mixin

            Mixin的实现不能依赖子类

            子类即使没有继承这个Mixin,也能照样工作,只是缺少了某个功能

           优点:

             使用Mixin可以在不对类进行任何修改的情况下,扩充功能

             可以方便的组织和维护不同功能组件的划分

             可以根据需要任意调整功能类的组合

             可以避免创建很多新的类、,导致类的继承混乱

            

    七、类的相关函数

      

  • 相关阅读:
    swift 关于闭包
    swift 多线程的使用
    线上故障解决流程解读
    coredata (转)
    归档
    NSSearchPathForDirectoriesInDomains
    【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例(转载)
    Objective-C Runtime (Runtime Library)转发
    Mac电脑系统降级(转载)
    UILabel
  • 原文地址:https://www.cnblogs.com/Cloudloong/p/9629093.html
Copyright © 2020-2023  润新知