第二月第三周

2018-09-17  本文已影响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 方法时,初始化动作就不会被再次执行 了

上一篇下一篇

猜你喜欢

热点阅读