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返回的实例,init在new的基础上可以完成一些其它初始化的动作,init不需要返回值
*
我们可以将类比作制造商,new方法就是前期的原材料购买环节,init方法就是在有原材料的基础上,加工,初始化商品环节
18,
* 单例设计模式
*
目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例
*
每一次执行 类名() 返回的对象,内存地址是相同的
19,
* 使用 类名() 创建对象时,Python 的解释器 首先 会 调用 new 方法为对象 分配空间
*
new 是一个 由 object 基类提供的 内置的静态方法,主要作用有两个:
*
- 在内存中为对象 分配空间
* - 返回 对象的引用
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 方法时,初始化动作就不会被再次执行 了
网友评论