一、面向对象
1.面向对象的编程思想主要是针对大型软件设计而来的。
2.面向对象编程使得程序的扩展性更强。可读性更好
3.面向对象编程将数据和操作数据相关的方法封装到对象中,组织代码和数据方式更加接近人的思维,从而大大提高了编程的效率。
二、类 属性 方法
(一)类的定义
1.类是模板,系统根据类定义造出的对象。
2.类的内容:属性 方法
3.语法 class类名:
类体
(1)类名命名规则一般规定首字母大写,驼峰原则
(2)类体中定义属性方法
(3)属性用来描述数据,方法(函数)用来描述数据相关操作
(二)构造方法__init__()与__new__()
1. 初始化对象需要定义构造__init__()方法.构造方法用于给对象初始化
2. 要点
(1)名称固定__init__()
(2)第一个参数是固定的必须为self。Self指刚刚创建的对象
(3)构造函数通常用来初始化实例对象的实例属性
(4)通过类名(参数列表)调用,调用后将创建好的对象赋值返回给相应的变量
(5)__init__方法用于初始化创建好的对象
(6)__new__()方法用于创建对象,一般无需重定义该方法
(7)如果不定义__init__()方法系统会自动创建__init__()方法,定义了该方法系统不会创建默认的方法
(一)实例属性与实例方法
1. 实例属性:从属于实例对象的属性,也成为“实例变量”
(1)实例属性一般在__init__()方法中通过以下代码定义:self.实例属性名=初始值
(2)在本类的其他实例方法中,也是通过self进行访问 ;self.实例属性名
(3)创建对象后,通过实例对象访问
Obj01=类名() #创建初始化对象,调用__init__()初始化属性
Obj01.实例属性名 = 值 #可以给自己属性赋值,也可以添加新的属性
2. 实例方法:实例对象的方法
(1)定义 def 方法名(self[形参列表]):
函数体
(2)定义实例方法第一个参数必须是self
(3)调用实例方法时不需要给self传参
(4)方法与函数区别
【1】 都是用来完成一个功能的语句块,本质一样
【2】方法调用时通过对象来调研,方法属于特定的实例对象
【3】直观上看,方法定义时需要传递self函数不需要
(5)dir(obj)获取所有的属性方法
(6)__dict__ 返回属性
(7)isinstance(对象,类型)判断对象是不是指定类型
(8)pass空语句
(二)类对象 类属性 类方法
1. 类对象 :定义类时生成类对象
2. 类属性 :从属于类对象的属性,也称为类变量,可以被所有类对象共享
(1)定义 class 类名 :
类变量名 = 初始值
(2)在类或者类的外面通过类名来读写
3. 类方法:从属于“类对象”的方法。类方法通过装饰器@classmethod
定义 @classmethod
def 类方法名(cls[参数列表])
方法体
(1)@classmethod必须位于方法上面一行
(2)第一个cls必须有,cls值“类对象”本身
(3)调用类方法格式:类名:类方法名(参数列表)。参数列表不需要也不能给cls传值
(4)类方法中访问实例属性和实例方法会导致错误。
(5)子类继承父类方法时,传入cls是子类对象,而非父类对象
4. 静态方法:python中允许定义与“类对象”无关的方法成为静态方法
“静态方法”和在模块中定义普通函数没有区别,只不过“静态方法”放到了“类的名字空间里面”,需要通过“类调用”
(1)静态方法通过装饰器@staticmethod来定义
@staticmethod
def 静态方法名([形参列表])
方法体
(2)@staticmethod必须位于方法上面一行
(3)调用静态方法格式:类名.静态方法名(参数列表)
(4)静态方法中访问实例属性,和实例方法会导致错误
(三)del析构方法 垃圾回收机制
1. 垃圾:一个对象没有被引用时(引用计数为0时),就会被当成垃圾,调用__del__()方法
2. __del_方法又称析构方法,同于实现对象被销毁时所需的操作
3. 也可以通过del语句删除对象,确保调用__del__方法
4. 系统自定义该方法,不需要自定义析构方法
(四)__cell__方法和可调用对象
1. python中,凡是可以将()直接应用到自身并执行,都称为可调用对象
2. 可调用对象包括自定义函数,内置函数,实例对象
3. 定义了__celll__()方法的对象称为可调用对象,即该对象可以向函数一样被调用
4. 该方法使得实例对象可以像调用普通函数那样以“对象名()”的形式调用
(五)方没有重载方法动态性
1. python中的方法没有重载,在类体中定义多个重名的方法只有最后一个有效
2. Python是动态语言。可以动态添加新的方法,动态修改已有方法
(八)私有属性 私有方法
1. 私有约定
(1)两个下划线开头的属性是私有的,其他的为公共的
(2)类内可以访问私有属性(方法)
(3)类外部不能直接访问私有属性(方法)
(4)类外部可以通过_类名__私有属性(方法名)访问私有属性(方法)
(九)@property装饰器
1.@property装饰器将一个方法的调用方式变为属性调用
2.@property装饰器主要处理属性的读操作写操作
(十)属性方法命名总结
1.属性方法命名
(1)_xxx:保护成员不能用from module import*导入,只有 类对象和子对象能访问这些元素
(2)__xxx__系统定义的特殊成员
(3)__xxx:累的私有成员,只有类对象自己访问,外部可通过对象名._类名__访问
2.类编码风格
(1)类名首字母大写,多个单词驼峰原则
(2)实例名模块名小写多个单词用下划线分开
(3)每个类应紧跟文档字符串说明类的作用
(4)可以用空行组织代码,类中使用一个空行隔开方法,模块中使用两个空行隔开类了
(十一)none对象
1.none是一个特殊常量,表示变量没有指向任何对象
2.在python中none本身也是对象,有自己的类型Nonetype
3.可以将None赋值给任何变量,但不能创建nonetype类型的对象
4.if语句判断时空列表。空字典、空元组 0 等都转成FALSE
5 is ==判断时 空列表 空字典 空字符 0 None不会传成False
三、面向对象三大特征(封装 继承 多态)
(一)封装 (隐藏)
隐藏对象的属性和实现细节,只对外提供必要的方法,相当于将细节封装起来,值对外暴露相关的调用方法。通过私有属性私有方法封装
(一) 继承
继承可以让子类具有父类的特性,提高代码的重用性,从设计上是一种增量进化,原有父类设计不变的情况下,可以增加新功能,或者改进新算法
2. 如果一个新类继承自己设计好的类,就具有了已有类的特征。已有的类称为父类或者基类,新的类称为子类或者派生类
3. Python支持多重继承,一个子类可以继承多个父类
4. 继承语法:class子类类名 (父类1[,父类名2,....]):
类体
5. 如果类定义没有指定父类默认父类是object类
6. 关于构造函数:
(1)子类不重写__init__实例化子类时,会自动调用父类定义的__init__
(2)子类重写了__init__时,实例化子类就不会调用父类已经定义的__init__
(3)如果重写了__init__时,要继承父类的构造方法,可以使用super关键字,也可以使用 父类名.__init__(self,参数列表)调用
7. 成员继承;子类继承了父类除了构造之外的所有的属性和方法
8. 方法重写:子类可以重新定义父类的方法,就会覆盖父类方法称为重写、
9. 通过mro()方法或者__mro__可以输出这个类的继承层次结构
10. 多重继承:一个子类111可以有多个父类,这样就具备了多个父类的特点
11. Super()获得父类的定义:如果想调用父类的方法时,可以通过super()来做
Super()代表父类的定义不是父类的对象;调用父类构造方法:super(子类名称.self).__init__(参数列表)
12.Object根类:oobject是所有类的父类,因此所有的类都有boject的属性方法
方法本质也是属性
13.重写str方法
(1)__str__方法,用于返回一个对对象的描述。将对象转成对字符串描述(内置函数str()就是调用该方法)
(2)经常用于print()方法查看信息
14.MRO方法解析顺序
(1).python支持多继承,如果父类中有相同的名字方法,在没有指定父类名字时按从左王右顺序搜索
(2).MRO:方法解析顺序。我们可以通过mro()分析法获得类的层次结构,方法解析顺序也是按这个“类的层次结构”寻找的。
(二) 多态
1.多态是指同一方法调用,由于对象不同会产生不同的行为。
(1)多态是方法的多态,属性没有多态
(2)多态必要条件 继承 重写
四.特殊方法 特殊属性
运算符是通过对象的特殊方法实现的
五、 对象的浅拷贝深拷贝
1. 浅拷贝不拷贝对象的子对象,python的拷贝一般是前拷贝
2. 深拷贝通过depcopy函数递归拷贝子对象的子对象
六 、组合
1. 除了继承组合也能实现代码的重用。核心是将父类对象作为子类的属性
组合继成如何选择
(1)是什么关系 is-a 继成
(2)有什么关系 has-a 组合
七、设计模式
设计模式:对某一类问题固定做法
(一)工厂模式
1. 工厂模式实现了创建者和调用者分离,使用专门的工厂类将选择实现类、创建对象进行同一管理的和控制
(二)单例模式
单利模式的核心作用是确保一个类只有一个实例,并且提供一个访问该实例的全局访问点