一,新式类,旧式类
新式类 :后面是以object结尾的
旧式类(经典类)
基类:定义类时,后面的括号后面写上object,会自动继承object类
新式类
旧式类
注意:dir函数可以查看函数继承的方法
二,实例
1,使用面向对象开发,第一部是设计类
2,使用 类名() 创建对象,创建对象的动作有两步
1,在内存中为对象分配空间
2,调用初始化方法__init__为对象初始化
3,对象创建后,内存中就有了一个对象的是是在在的存在--实例
因此:
1,创建出来的对象叫做类的实例
2,创建对象的动作叫做实例化
3,对象的属性叫做实例属性
4,对象调用的方法叫做实例化方法
在程序执行时:
1,对象各自拥有自己的实例属性
2,调用对象的方法,可以通过self访问自己的属性,调用自己的方法
结论:
1,每一个对象都有自己独立的内存空间,保存各自不同的属性
2,多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用转移到方法的内部
三,多态
多态:不同的子类(继承覆盖的知识)对象调用相同的方法,产生不同的结果
示例
四,类结构
1,类是一个特殊的对象
Python中一切皆对象
class AAA: 定义的类属性属于类对象
obj1 = AAA: 属于实例对象
在运行程序时,类 同样会被加载到内存
在python中,类 是一个特殊的对象--类对象
除了封装 实例(对象)的属性和方法外,类对象还可以有自己的属性和方法
通过 类名. 的方式可以直接访问类的属性或者调用类的方法
类属性就是针对类对象定义的属性
使用赋值语句在class关键字下方可以定义类属性
类属性用于记录这个类的相关的特性
类方法就是针对类对象定义的方法
在类方法内部就可以直接访问类属性或者调用其他类方法
语法如下:
@classmethod
def 类方法(cls):
pass
示例1
示例2
2,静态方法: 在开发时,如果需要在类中封装一个方法,这个方法 即不需要访问实例属性或者调用实例方法 也不需要访问类属性或者调用类方法 这个时候可以把这个方法封装成一个静态方法 语法如下: @staticmethod def 静态方法(): pass 静态方法需要修饰器@staticmethod来标识,告殊解释器这是一个静态方法 通过类名,调用静态方法
示例1:
示例2:
需求
1,设计一个Game类
2,属性
记录游戏的历史最高分
记录当前游戏玩家的玩家姓名
3,方法
方法show_help显示游戏帮助信息
方法show_top_score显示历史最高分
方法start_game开始当前玩家的游戏
4,主程序步骤
1,查看帮助信息
2,查看历史最高分
3,创建游戏对象,开始游戏
总结:
1,实例方法:方法内部不需要访问实例属性
2,类方法:方法内部只需要访问类属性
3,静态方法:方法内部不需要访问实例属性和类属性
如果方法内部既需要访问实例属性又需要访问类属性,应该定义实例方法
五,重要设计模式
使用类名()创建对象时,python的解释器首先会调用__new__方法为对象分配空间
__new__是一个有object基类提供的内置的静态方法,主要有两个作用:
在内存中为对象分配空间
返回对象的引用
python解释器获得对象的引用后将引用作为第一个参数,传递给__init__方法
__new__:负责给对象分配空间
__init__(初始化方法)负责给对象初始化
示例1
需求:不同的对象的地址相同
在每次使用 类名()创建对象时,python的解释器都会自动调用两个方法
__new__分配空间
__init__对象初始化
但在上一小结中 __new__方法改造之后,每次都会得到第一次被创建对象的引用
但是:初始化方法还会被再次调用
示例2
需求:不同的对象地址相同并且初始化方法只执行一次