day015面向对象(初识)编写及其三大特征
主要内容
·什么是面向过程
·什么是面向对象
·编写面向对象程序
·面向对象的三大特征:封装、继承、多态
一、面向对象和面向过程
1、两者的比较分析
面向过程:
1.以事物的流程为核心,核心是过程“过程”二字,指解决问题的步骤,即先干什么,后干什么;
2.优点:对问题的处理具体化,流程化,编写相对简单;
3.缺点:可扩展性差,对源代码的增删改,会产生全局的变化。
面向对象:
1.一切以对象为中心,不再是事物发展的流程,而是操纵某一个事物的个体(对象)
2.优点:可扩展性强
3.缺点:编程的复杂度高于面向过程
2、如何选用两者,看需求
1.大型项目更适合于面向对象
2.小型脚本程序更适合于面向过程
二、编写面向对象的程序(重点)
1、语法
·1.先创建类,归类,对你要面对的对象归类总结,相当于图纸
·2.使用类创建对象
class 类名(object): # object是根源,默认的不用写
def __init__(self, age): # 构造方法,创建对象的时候自动调用这个方法,self是创建的对象本身
self.age = age # 存放共同的属性,
def 方法名(self, 参数): # 方法,跟函数一样的功能
方法体
创建对象:
变量(引用,类似句柄) = 类名(参数)
# 访问对象的属性信息
对象.属性
# 方法的访问:
对象.方法()
fe: 具体创建示例
# 类名首字母大写.
class Computer:
# 构造方法. 在创建的对象的时候由系统自动访问这个方法
# self: 自己. 自身. 类的对象. 当前正在创建的对象
def __init__(self, pinpai, price, cpu, neicun): # 谁在调用, self就是谁, self 由python自动传递,
# 此处就是封装
self.pinpai = pinpai
self.price = price
self.cpu = cpu
self.neicun = neicun
# 方法. 该类型的对象能够执行哪些操作
def dayouxi(self, game): # 谁调用的这个方法. self就是谁
# 我用我的self.pinpai的调用. 利用很牛B的self.cpu来完成吃鸡操作
# 对方法进行封装
print("我要打游戏, 我要%s" % game)
c = Computer("微软",25000,"i9","5T") # 创建对象
print(c.price) # 访问对象属性,需打印
c.dayouxi("吃鸡") # 访问方法,等同于函数的调用
三、面向对象的三大特征
1、封装
把各种内容组合到一起,统一进行存储和使用,这就是封装。
1.对属性封装
def __init__(self, name)
self.name = name # 对属性的封装
2.对方法的封装
def __init__(self, name)
self.name = name # 对属性的封装
# 对方法的封装
def login(self):
pass
def regist(self):
pass
def update_psw(self):
pass
2、继承
继承: 子类自动拥有父类中除了私有内容外的其他所有内容
1.单继承
继承调用的顺序:
子类没有,调用父类的(子无调父)
子类有,先用子类的,不用父类(子有用己)
子类还可以在父类的基础上派生,扩展,说白了,子类的范围可以大于父类的(子拓父业)
fe1: 子无调父
class Niu:
def da(self):
print("牛魔王打架很厉害")
class HongHaiEer(Niu): # 这样写是继承Niu的非私有内容
pass
hhl = HongHaiEer()
hhl.da() # 此时调用父类的方法,打印父类的
fe2: 子有用己,子拓父业
class Niu:
def da(self):
print("牛魔王打架很厉害")
class HongHaiEer(Niu):
def da(self):
print("喷火")
def fei(self):
print("风火轮") # 子类在父类的基础上扩展了一些功能. 派生
hhl = HongHaiEer()
hhl.da() # 此时先调用自己的方法
2、多继承
调用顺序
自己有就用自己的,
没有的就调用父类的,以 class c(fu2, fu1) 靠近的顺序调用,fu2的顺序比fu1的近,
fe: 调用顺序
class Foo1:
def money(self):
print("有钱")
class Foo2:
def play(self):
print("玩儿")
def money(self):
print("没钱")
class Bar(Foo2, Foo1): # MRO c3算法
pass
b = Bar()
b.money() # Foo2离得近,所以先调用,打印 “没钱”
3、多态
同一个对象. 拥有多种形态 java c++
python自带多态,我们一直在用
好处:超高的扩展性,面向对象的核心和思想
fe: python多态的体现
在python中多态的效果感受不够明确
class YaoGuai:
def teng(self): # 方法封装
print("妖怪一定会疼")
class ZhiZhuJing(YaoGuai):
def teng(self):
print("蜘蛛精很痛")
class HeiXiongJing(YaoGuai):
def teng(self):
print("黑熊精也很疼")
class BaiGuJing(YaoGuai):
def teng(self):
print("白骨精骨头很疼")
class JinJiaoDaWang(YaoGuai):
def fangundeteng(self):
print("爆炸的疼")
class SunWuKong:
def da(self, yg): # 封装
yg.teng() # 只要包含了xxx功能的内容都可以试用. 鸭子模型 -> 多态性
# 西游记开始
swk = SunWuKong()
hxj = HeiXiongJing()
swk.da(hxj)
bgj = BaiGuJing()
swk.da(bgj)
zzj = ZhiZhuJing()
swk.da(zzj)
alex = JinJiaoDaWang()
swk.da(alex)