一、什么是面向对象(oop:object oriented programming)
面向过程:侧重于怎么做
1.把完成某一个需求的 所有步骤 从头到尾 逐步实现
2.根据开发要求,将某些功能独立的代码封装成一个又一个函数
3.最后完成的代码,就是顺序的调用不同的函数
特点:
1.注重步骤与过程,不注重职责分工
2.如果需求复杂,代码会变得很复杂
3.开发复杂项目,没有固定的套路,开发难度很大面向对象:谁来做
相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法
1.在完成某一个需求前,首先确定职责--要做的事(方法)
2.根据职责确定不同的对象,在对象内部封装不同的方法(多个)
3.最后完成代码,就是顺序的让不同的对象调用不同的方法
特点:
1.注重对象和职责,不同的对象承担不同的职责
2.更加适合对复杂的需求变化,是专门应对复杂项目的开发,提供的固定套路
3.需要在面向过程的基础上,再学习一些面向对象的语法
二、熟悉面向对象编程(python iava c++)
类:是对一群具有相同特征或行为的事物的一个统称,不能直接使用(比如:飞机制造图纸不能飞上天)
特征:属性
行为:方法
对象:由类创建出来的一个具体的存在,可以直接使用。对象的创建:对象变量 = 类名()
*在程序开发中:应该先有类 再有对象
类的设计
1.类名 这类事物的名字,满足大驼峰命名法(每一个单词的首字母大写,单词与单词之间没有下划线)
2.属性 这个类创建出的对象有什么样的特征,如果不知道设置什么初始值,可以设置为None,表示什么都没有,表示一个空对象,没有方法和属性,是一个特殊的属性,可以将None赋值给任何一个变量。赋值格式:self.属性名 = 属性值
3.方法 这个类创建出的对象有什么样的行为
类的创建
class 类名:
def 方法1(self):
pass
def 方法2(self):
pass
self意义
(1)哪一个对象调用的方法,self就是哪一个对象的引用
(2)在方法内部可以通过self访问对象属性
类对象的生命周期
(1)在对象的生命周期内可以访问对象的属性和方法
(2)一个对象从调用类名创建,生命周期开始
(3)一个对象的__del__方法一旦被调用,声明周期就结束
私有属性
(1)外界不能直接访问 ,但是可以通过方法调用访问
(2)定义:在属性前面添加两个下划线,就是定义私有属性
(3)对象不希望公开的属性
私有方法
(1)外界不能直接调用
(2)定义:在方法前面添加两个下划线,就是定义私有方法
(3)对象不希望公开的方法
三、面向对象的三大特点
1.封装
- 将属性和方法封装到一个抽象的类中(为什么说抽象,因为类不能直接使用)
- 外界使用类创建对象,然后让对象调用方法(方法的细节都被封装在类的内部)
例子:需求写一个人类,小明爱跑步,体重75.0,每次跑步会减肥0.5公斤,每次吃东西会增加1公斤,小美的体重为45.0公斤。
class Person:
def __init__(self,name,weight):
# 初始化方法中增加两个参数由外界传递
# self.属性 = 形参
self.name = name
self.weight = weight
def __str__(self):
return '我的名字叫 %s 体重是 %.2f' %(self.name,self.weight)
def run(self):
print '%s 爱跑步' %self.name
# 在对象方法的内部,是可以直接访问对象的属性
self.weight -= 0.5
def eat(self):
print '%s 吃东西' %self.name
self.weight += 1
xx = Person('小明',75.0)
xx.run()
xx.eat()
print xx
# 同一个类创建出来的多个对象之间,属性互补干扰
xm = Person('小美',45.0)
xm.run()
xm.eat()
print xm
2.继承
(1)实现代码的重用,相同的代码不需要重复的写
(2)子类拥有父类的所有属性和方法,子类继承于父类,可以享受父类已经封装好的方法,子类应该根据自己的职责,封装子类特有的属性和方法
(3)定义方法 class 类名(父类):
def 子类方法
(4)继承拥有传递性,子类拥有父类的父类的属性和方法,也就相当于孙子拥有爷爷的属性和方法
(5)子类也叫派生类,父类也叫基类,继承也就是派生
3.多态
(1)以封装和继承为前提,不同的子类对象调用相同的方法,产生不同的结果
四、父类方法
父类方法的重写
(1)覆盖父类的方法,如果子类中重写了父类的方法,在运行中,只会调用在子类中重写的方法,不会调用父类的方法
(2)若还需要显示父类中被覆盖的方法,就需要调用原本在父类中被覆盖的方法:父类名.父类方法(self)
(3)在子类中增加扩张覆盖的父类方法
(4)!!!初始化方法也可能被覆盖,所以需要在子类的初始化方法中调用父类的的初始化方法
继承父类的私有属性和私有方法
(1)在外界子类对象和父类对象不能直接访问父类对象的私有属性和私有方法
(2)在子类的对象方法中,不能访问调用父类的私有属性和方法
(3)若子类需要调用父类私有属性和私有方法:在父类里面定义一个公有方法,在父类的公有方法里面调用父类私有属性和私有方法,然后子类和父类的对象就可以通过调用父类的公有方法间接的调用父类的私有方法和私有属性
多继承
(1)可以让子类对象同时具有多个父类的属性和方法
(2)按照继承顺序继承
五、新式类旧式类
1.object :是python为所有对象提供的基类,提供一些内置的属性和方法,可以使用dir函数查看
2.新式类:以object为基类的类,推荐使用
3.经典类:不以object为基类,不推荐使用
4.python3.x中默认使用object类,python2.X不指定的话,不会以object作为基类
5.格式:class A(object):