面向对象的三大特性:
1.封装:根据职责将属性和方法封装到一个抽象类中
2.继承:实现代码的重用,相同的代码不需要重复的写
3.多态:不同的对象调用相同的方法,产生不同的结果,
增加代码的灵活度
一.封装
1.封装是面向对象编程的一大特点
2.面向对象编程的第一步将属性和方法封装到一个抽象的类中
3.外界使用类创建对象,然后让对象调用方法
4.对象方法的细节都被封装在类的内部
需求:
1.房子有户型,总面积和家具名称列表
新房子没有任何的家具
2.家具有名字和占地面积,其中
床:占4平米
衣柜:占2平米
餐桌:占1.5平米
3.将以上三件家具添加到房子中
4.打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
封装实例:(士兵开枪)
二.继承:
子类继承自父类,可以直接享受父类中已封装好的方法
子类中应该根据自己的职责,封装子类特有的属性和方法
重写父类方法有两种情况:
1.覆盖父类的方法
2.对父类方法进行扩展
1.覆盖父类的方法
如果在开发中,父类的方法的实现和子类方法的实现,
完全不同,就可以使用覆盖的方式
具体实现的方式,就相当于在子类中定义了
一个和父类同名的方法并且实现
重写之后,在运行时,只会调用子类的重写方法,
而不会调用父类的封装的方法
对父类的方法进行扩展
如果在开发中,子类的方法实现包含有父类的方法实现
(父类原本封装的方法是子类方法的一部分
就可以使用扩展方法)
1.在子类中重写父类方法
2.在需要的位置使用父类名.方法名(self)
来调用父类方法的执行(使用父类名称调用父类方法)
3.代码其他的位置针对子类的需求,编写子类特有的代码实现
多继承
子类拥有一个父类叫做单继承
子类可以拥有多个父类,并且具有所有父类的属性和父类的方法
语法:
class 子类名(父类1,父类2,……)
pass
1.封装:根据职责将属性和方法封装到一个抽象的类中
定义类的准则
2.继承:实现代码的重用,相同代码不需要重复编写
设计类的技巧
3.多态:不同的子类(这是之前提到的继承的知识)
对象调用相同的方法,产生不同的执行结果
类的结构:
实例:
1.使用面向对象开发,第一步是设计类
2.使用 类名() 创建对象,创建对象的动作有两步
1.在内存中为对象分配空间
2.调用初始化方法init为对象初始化
3.对象创建后,内存中就有一个对象的实实在在的存在–实例
因此:
1.创建出来的对象叫做类的实例
2.创建对象的动作叫做实例化
3.对象的属性叫做实例属性
4.对象调用的方法叫做实例化方法
在程序中执行时:
1.对象各自拥有自己的实例属性
2.调用对象的方法,可以通过self
访问自己的属性
调用自己的方法
结论:
1.每一个对象都有自己独立的内存空间,保存各自不同的属性
2.多个对象的方法,在内存中只有一份,在调用方法时,
需要把对象的引用传递到方法的内部
类是一个特殊的对象
python中一切皆对象
class AAA: 定义的类属性属于类对象
obj1 = AAA:属于实例对象
在运行程序时,类同样会被加载到内存
在python中,类是一个特殊的对象–类对象
除了封装 实例的属性和方法外,类对象还可以有自己的属性和方法
通过类名. 的方式可以直接访问类的属性或调用类的方法
类属性就是针对对象定义的属性
使用赋值语句在class关键字的下方可以定义类属性
类属性用于记录这个类相关的特性
类方法就是针对类对象定义的方法
在类方法内部就可以直接访问类属性或者调用其他类方法
语法如下:
@classmethod
def 方法(cls)
pass
静态方法
在开发时,如果需要在类中封装一个方法,这个方法:
即不需要访问实例属性或者调用实例方法
也不需要访问类属性或者调用类方法
这个时候可以把这个方法封装成一个静态方法
语法如下:
@staticmethod
def 静态方法名():
pass
静态方法需要修饰@staticmethod来标识,告诉解释器这是一个静态方法
通过类名.方法名调用静态方法
只执行一次初始化工作
在每次使用 类名()创建对象时,python的解释器会自动调用两个方法
new 分配空间
init 对象初始化
但在上一结中 new方法改造之后,每一次都会得到第一次被创建对象的引用
但是:初始化方法还会被再次调用
使用类名()创建对象时,python的解释器首先会调用new方法为对象分配空间
new是一个有object基类提供的内置的静态方法,主要有两个作用:
在内存中为对象分配空间
返回对象的引用
python的解释器获得对象的引用后,将作为第一个参数,传递给init方法
new:负责给对象分配空间 init(初始化方法)负责给对象初始化