美文网首页
第二月第三周

第二月第三周

作者: 卑微小利 | 来源:发表于2018-09-17 20:01 被阅读0次

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

    2,类是对象的模子,对象是类的具体实例

    3,魔法方法
    —new—()创建对象 并返回对象引用
    —init—()初始化属性
    —del—()删除对象调用
    —str—()打印对象调用 要有返回值

    4,重写:当父类方法不能满足子类时需要重写
    多态:可对不同类的对象使用同样的操作
    封装:对外部世界隐藏对象的工作细节
    继承: 以普通类为基础建立专门的类对象

    5,类是创建对象的模板

    6,如果我们不确定要往函数中传入多少个参数,或者我们向往函数中以列表和元组的形式传参数时,那就要使用*args

    7,如果我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,那就要使用**kwargs。

    8,如果一个对象与另一个对象有一定的关系,那么一个对象可用是另一个对象的属性

    9,python中是可以多继承的
    父类中的方法,属性,子类会继承

    10,使用面向对象开发,第一步是设计类
    使用类名()创建对象,创建对象的动作有两步
    1)在内存中为对象 分配空间
    2)调用初始化方法—init—为对象初始化

    11,对象创建后,内存中就有一个对象的实实在在的存在————实例

    12,每一个对象都有自已独立的内存空间,保存各自不同的属性
    多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部

    13,类属性就是给类对象中定义的属性
    通常用来记录与这个类相关的特征

    14,
    * 类方法需要用 修饰器 @classmethod 来标识,告诉解释器这是一个类方法
    * 类方法的 第一个参数 应该是 cls

        * 由 哪一个类 调用的方法,方法内的 cls 就是 哪一个类的引用
        * 这个参数和 实例方法 的第一个参数是 self 类似
        * 提示 使用其他名称也可以,不过习惯使用 cls
    * 通过 类名. 调用 类方法,调用方法时,不需要传递 cls 参数
    * 在方法内部
    
        * 可以通过 cls. 访问类的属性
        * 也可以通过 cls. 调用其他的类方法
    

    示例需求
    * 定义一个 工具类
    * 每件工具都有自己的 name
    * 需求 —— 在 类 封装一个 show_tool_count 的类方法,输出使用当前这个类,创建的对象个数

    15,
    * 在开发时,如果需要在 类 中封装一个方法,这个方法:

        * 既 不需要 访问 实例属性 或者调用 实例方法
        * 也 不需要 访问 类属性 或者调用 类方法
    * 这个时候,可以把这个方法封装成一个 静态方法
    

    语法如下

    @staticmethod
    def 静态方法名():
    pass
    * 静态方法 需要用 修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法
    * 通过 类名. 调用 静态方法

    16,
    1. 实例方法 —— 方法内部需要访问 实例属性

        * 实例方法 内部可以使用 类名. 访问类属性
    2. 类方法 —— 方法内部 只 需要访问 类属性
    3. 静态方法 —— 方法内部,不需要访问 实例属性 和 类属性
    

    提问如果方法内部 即需要访问 实例属性,又需要访问 类属性,应该定义成什么方法?答案
    * 应该定义 实例方法
    * 因为,类只有一个,在 实例方法 内部可以使用 类名. 访问类属性

    17,
    * new至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
    *
    new必须要有返回值,返回实例化出来的实例,这点在自己实现new时要特别注意,可以return父类new出来的实例,或者直接是object的new出来的实例
    *
    init有一个参数self,就是这个new返回的实例,initnew的基础上可以完成一些其它初始化的动作,init不需要返回值
    *
    我们可以将类比作制造商,new方法就是前期的原材料购买环节,init方法就是在有原材料的基础上,加工,初始化商品环节

    18,
    * 单例设计模式

        * 
    

    目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例
    *
    每一次执行 类名() 返回的对象,内存地址是相同的

    19,
    * 使用 类名() 创建对象时,Python 的解释器 首先 会 调用 new 方法为对象 分配空间
    *
    new 是一个 由 object 基类提供的 内置的静态方法,主要作用有两个:

        * 
    
    1. 在内存中为对象 分配空间
      *
    2. 返回 对象的引用

    Python 的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给 init 方法

    重写 new 方法 的代码非常固定!
    *
    重写 new 方法 一定要 return super().new(cls)
    *
    否则 Python 的解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法
    *
    注意:new 是一个静态方法,在调用时需要 主动传递 cls 参数

    20,
    * 单例 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例

        1. 
    

    定义一个 类属性,初始值是 None,用于记录 单例对象的引用
    2.
    重写 new 方法
    3.
    如果 类属性 is None,调用父类方法分配空间,并在类属性中记录结果
    4.
    返回 类属性 中记录的 对象引用

    只执行一次初始化工作
    * 在每次使用 类名() 创建对象时,Python 的解释器都会自动调用两个方法:

        * 
    

    new 分配空间
    *
    init 对象初始化
    *
    在上一小节对 new 方法改造之后,每次都会得到 第一次被创建对象的引用
    *
    但是:初始化方法还会被再次调用

    需求

    1. 定义一个类属性 init_flag 标记是否 执行过初始化动作,初始值为 False
    2. 
    

    init 方法中,判断 init_flag,如果为 False 就执行初始化动作
    3.
    然后将 init_flag 设置为 True
    4.
    这样,再次 自动 调用 init 方法时,初始化动作就不会被再次执行 了

    相关文章

      网友评论

          本文标题:第二月第三周

          本文链接:https://www.haomeiwen.com/subject/jdddnftx.html