1、什么是面向对象
     对象是特征和技能的结合体
      特征:变量
      技能:函数

     优点:扩展性高
     缺点:可控性差


2、什么是类
    类是一系列对象相似的特征和技能的结合体

    1、把一类事物的静态属性和动态可以执行的操作组和在一起得到的这个概念就是类
     2、类是一个个体就是对象,对象是具体的,实实在在的事物
    3、对象是特征与技能的结合体,其中特征和技能分别对应对象的数据属性和方法属性
    4、对象(实例)本身只有数据属性,但是python的class机制会将类的函数绑定到对象上,称为对象的方法,或者叫绑定方法,绑定方法唯一绑定一个对象,同一个类的方法绑定到不同的对象上属于不同的方法,内存地址会不一样。
     5、类的数据属性是共享给所有的,类的函数属性是绑定到对象的 ,是对象独有的
     6、创建一个对象(实例)就会创建一个对象的名称空间,存放对象的名字和其他的属性
     

3、定义类的目的
   是为了调用类来产生对象,对象是变量+函数


4、初始化__init__的作用
所谓初始化构造函数就是在构造对象的同时被对象自动调用,完成对事物的初始化,一个类只要生成一个类对象,它一定会调用初始化构造函数. 
特点: 
1>一个类中只能有一个初始化构造函数 
2>不能有返回值 
3>可以用它来为每个实例定制自己的特征 

面向对象的三大特性
1、继承
   1、什么是继承?
      继承是创建类的方式,创建的子类可以遗传父类功能或者属性
       特点:
        python中支持多继承

  优点:
1、减少代码冗余
缺点:
1、把子类与父类强耦合到一起

    2、重用父类的功能
        方式一:指名道姓的调用,(与继承没有关系)
        方式二:用super()调用(严格依赖继承)
         suprt()的返回值是一个特殊的对象,该对象专门用来调用父类中的属性
    3、组合的概念
     1、一个类的属性可以是一个类对象,通常情况下在一个类里面很少定义一个对象就是它本身,实际意义很少 
     2、将另外一个对象作为自己的属性成员(自己的一个属性来自于另外一个对象),这就是组合 
     3、组合也可以解决代码冗余的问题,但是组合反应的是一种什么是什么的关系。
  示例:

class Date:
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day
    def tell(self):
        print("%s--%s--%s"%(self.year,self.month,self.day))

class People:
    def __init__(self,name,age):
        self.name = name
        self.age = age

class Student(People):
    def __init__(self,name,age,sex,year,month,day):
        People.__init__(self,name,age)
        self.sex = sex
        #下面这一步骤就是组合
        self.birth = Date(year,month,day)

if __name__ == '__main__':
    student = Student("alex",25,"man",2015,12,31)
    print("student的birth成员指向了一个Date对象!")
    print("%s"%student.birth)
    student.birth.tell()

运行结果:
student的birth成员指向了一个Date对象!
<__main__.Date object at 0x0000000002604358>
2015--12--31

Process finished with exit code 0

 

 MRO列表
   python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如:

 F.mro() #等同于F.__mro__
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。 


2、多态
多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)
文件有多种形态:文件、文本文件、可执行文件

   1、什么是多态性(注意:多态与多态性是两种概念)

    多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容     的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在   接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消          息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数

   2、为什么要用多态性
      其实大家从上面多态性的例子可以看出,我们并没有增加上面新的知识,也就是说Python本身就是支持多态性的,这么做的好处是什么呢?
       1、增加了程序的灵活性
     以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
       2、增加了程序额可扩展性
     通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

   注:
     多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度),多态性:一种调用方式,不同的执行效果(多态性)

3 、封装
   1、什么是封装:
      装就是把一堆属性存起来,封的概念就是把这些属性给隐藏起来
      强调:封装单从字面的意思等同于隐藏,但其实封装绝对不是单纯的隐藏

   2、为什么要用封装:
      明确的区分内外,对外是隐藏的,对内是开放的
   3、如何把属性隐藏起来,就是在属性前面加上__开头
     注意:1、为一个属性加上__开头,会 在类定义阶段将属性名变形了:_自己的类名__属性名
                2、这种语法意义上的变形,只在类定义阶段发生一次
                3、如果父类不想让子类覆盖自己的方法,可以在方法名前加__开头。
   4、封装的目的:
      封装数据属性的目的,把数据属性封装起来,然后需要开辟接口给外部的使用者使用,好处是我们可以在接口之上添加控制逻辑,从而严格控制访问者对属性的操作

   5、封装函数属性的目的:为了隔离复杂度

   6、特性(property)
     1、property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
     2、将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则(使用的原因) 
     3、一旦给函数加上一个装饰器@property,调用函数的时候不用加括号就可以直接调用函数了 
     4、其实就是伪装成一个数据属性


绑定方法和非绑定方法
   绑定方法:
      在类内部定义的函数,默认就是给对象来用的,而且绑定给对象用的,称之为对象的绑定方法, 绑定给对象的方法特殊之处,应该由对象来调用,对象调用会自动把对象当成第一参数传入。
      绑定给类的方法,应该由类来调用,类调用会自动把类当成第一参数传入
    非绑定方法:staticmethod
       非绑定方法,就是一个普通函数
          特性:既不跟类绑定也不跟对象绑定,这就意味着谁都能调用,谁来用都是一个普通函数,也就是说没有了自动传值 的特性了






posted on 2018-06-06 18:28  muzinianhua  阅读(306)  评论(0编辑  收藏  举报