学习笔记-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可以在不对类进行任何修改的情况下,扩充功能

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

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

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

        

七、类的相关函数

  

原文地址:https://www.cnblogs.com/Cloudloong/p/9629093.html