初识面向对象
1. 面向对象和面向过程
1. 面向过程:一切以事物的流程为核心,核心是“过程”二字,过程指的是解决问题的步骤,即,先干什么,后干什么,
基于该思想编写程序就好比在编写一套流水线,是一种机械式的编程思维。
优点:负责的问题流程化,编写相对简单
缺点:可扩展性差
2.面向对象:一切以对象为中心,具有相同属性和动作的结合体叫对象。面向对象思维,要自己建立对象,自己建立场景,自己可
以随意指挥你所建立场景中的一切对象去干你想要实现的操作。
优点:可扩展性强
缺点:编程的复杂度高于面向过程
对比:面向过程在执行一个操作的时候,只需要按照执行步骤,一步一步去直接执行;
面向对象则需要建立一个执行所需的场景,然后再建立一个对象或者多个对象,
然后再定义对象的属性以及所要实现的操作。
2. 面向对象如何编写
想象生产一辆车,首先要创建车这一类事物,然后定义这一类事物都有哪些属性
class Car: (类名首字母大写) # 创建类名
c = Car() # 创建一辆车
c.color = '红色' }
c.pai'京A12345' } # 定义车的属性
c.pailiang'1.6T' }
print(c.color)
print(c.pai)
print(pailiang)
# 使用“车”的特征可以给定义的对象设置属性
# 我们可以在创建一辆车,并设置新的相关属性
c2 = Car()
c2.color = '黑'
c2.pai = '冀GW7835'
c2.pailiang = '1.5T'
print(c)
print(c2)
# 这两辆车是完全不相同的两量车,但是它们拥有相同的属性。
# 有了属性,我们就可以进一步对对象去实行操作。在python中我们使用__init__(self)函数
给所创建的对象进行初始化操作,这个函数(方法)被称为函数构造(方法)。
class Car:
def __init__(self,name,pai,pailing): # self表示当前类你所创建的对象,谁访问这个方法,这个self就是谁。
self.color = color
self.pai = pai
self.pailiang = pailiang
c1 = Car('红','京A7896','1.6T')
c2 = Car('黑','冀GW1643','2.0T')
print(c1.color)
print(c2.color)
# 通过打印可以看出,这两个对象一样可以设置属性。
# 创建的车这一类不仅只有属性,它还可以实现一列的动作,我们要把车所实现的动作写成一个构造函数(方法)
class Car:
def __init__(self,color,pai,pailiang):
self.color = color
self.pai = pai
self.pailiang = pailiang
def run(self,speed):
print('车可以跑%s迈' % speed)
c = Car('红色','京A7896','2.0T')
c.run(120) # 这是python会自动把对象c传递给run方法的第一个参数位置。
总结: 类与对象的关系: 类是对事物的总结. 抽象的概念. 类用来描述对象. 对象是类的实例
化的结果. 对象能执行哪些方法. 都由类来决定. 类中定义了什么. 对象就拥有什么并且可以做什么。
3. 面向对象和面向过程的整体对比
根据具体案例来对比:把大象装进冰箱
1.面向过程
非函数版:
print('打开冰箱门')
print('把大象装进去')
print('关闭冰箱门')
函数版:
def open():
print('打开冰箱门')
def zhuang():
print('把大象装进去')
def colse():
print('关闭冰箱门')
open()
zhuang()
colse()
2.面向对象
class Elephant():
def open(self):
print('打开冰箱门')
def zhuang(self):
print('把大象装进冰箱')
def close(self):
print('关闭冰箱门')
dx = Elephant()
dx.open()
dx.zhuang()
dx.close()
# 面向对象相对面向过程比较麻烦
# 看下一个案例:小猪佩奇大战奥特曼. 说. 有一个小猪名叫佩奇,
今年40岁了. 会使用嘴巴嘟嘟必杀技. 他不光大战奥特曼, 还会大战蝙蝠侠, 蜘蛛侠
1.面向过程
def da_atm(name,age,jn):
print('%s,今年%s岁了,使用%s技能打奥特曼' % (name,age,jn))
def da_zzx(name,age,jn):
print('%s,今年%s岁了,使用%s技能打蜘蛛侠' % (name,age,jn))
def da_bfx(name,age,jn):
print('%s,今年%s岁了,使用%s技能打战蝙蝠侠' % (name,age,jn))
da_atm('小猪佩奇','40','嘴巴嘟嘟')
da_zzx('小猪佩奇','40','嘴巴嘟嘟')
da_bfx('小猪佩奇','40','嘴巴嘟嘟')
2.面向对象
class Pig:
def __init__(self,name,age,jn):
self.name = name
self.age = age
self.jn = jn
def da_atm(self):
print('%s,今年%s岁了,使用%s技能打奥特曼' % (self.name, self.age, self.jn))
def da_zzx(self):
print('%s,今年%s岁了,使用%s技能打奥特曼' % (self.name, self.age, self.jn))
def da_bfx(self):
print('%s,今年%s岁了,使用%s技能打奥特曼' % (self.name, self.age, self.jn))
peiqi = Pig('小猪佩奇','40','嘴巴嘟嘟')
peiqi.da_atm()
peiqi.da_zzx()
peiqi.da_bfx()
# 在这个案例中,很明显面向对象的思想、思维方式更加清新一些,代码也更容易编写。
但是具体的使用情况需要根据具体的需求来判断使用。
4.面向对象的三大特征
1.封装:
把很多数据封装到一个对象中,把固定功能的代码封装到一个代码块、函数、对象,打包成模块,
这都属于封装的思想,具体的情况具体分析使用。仔面相对象的思想中,把一些看似无关紧要的
内容组合到一起统一进行存储和使用,这就是封装。
2.继承:
子类可以自动拥有父类中除了私有属性的其他内容,⼦类可以随便父类的东西. 但是一定要认清楚个事情.
必须先有父类, 后有子类,顺序不能乱。在python中实现继承非常简单. 在声明类的时候, 在类名后面添加个小括号,
就可以完成继承关系.单纯的从代码层面上来看. 两个类具有相同的功能或者特征的时候. 可以采用继承的形式.
提取一个父类, 这个父类写着两个类相同的部分. 然后两个类分别取继承这个类就可以了. 这样写的好处
是我们可以避免写很多重复的功能和代码. 如果从语义中去分析的话. 会简单很多. 如果语境中出现了x是一种y.
这时, y是一种泛化的概念. x比y更加具体. 那这时x就是y的子类.
# 写案例:白骨精是一个妖怪. 妖怪天生就会吃人, 白骨精一出生就知道如何"吃人". 此时 白骨精继承妖精的天性。
class Yoo:
def chiren(self):
print('我是妖精,我生来就会吃人')
class Bgj(Yoo):
pass
bgj = Bgj()
bgj.chiren()
# 妖精天生就会吃人,白骨精属于妖精类,所以白骨精继承妖精吃人的技能。
在python中,一个类可以继承多个父类,父类多的时候,父类相同的属性,就要靠父类的远近来区别了。
# 写案例
class fulei1:
def chi(self):
print('告诉你 1+1=2')
def play(self):
print('带你去 天安门、故宫')
class fulei2:
def le(self):
print('给你讲笑话')
def play(self):
print('带你去 天安门')
class zilei(fulei1,fulei2):
pass
erzi = zilei()
erzi.chi() # fulei1 的功能
erzi.le() # fulei2 的功能
erzi.play() # fulei1有,就不找fulei2
3. 多态:
同一个对象, 多种形态。这个在python中其实是很不容易说明⽩的。因为我们一直在用,只是没有具体的说。
比如,我们创建一个变量a = 10 , 我们知道此时a是整数类型,但是我们可以通过程序让a = "alex", 这时,
a又变成了字符串类型。这是我们都知道的,但是这个就是多态性,同一个变量a可以是多种形态,可能这样
的程序和说法你还get不到具体什么是多态.
# 案例:
饲养员⼀天的⼯作. 喂养猪, 喂狗, 还得喂大象.
class Animal:
def chi(self):
print('动物都会吃')
class Pig:
def chi(self):
print('猪在吃')
class Dog:
def chi(self):
print('狗在吃')
class Elephant:
def chi(self):
print('大象在吃')
class Siyangyuan:
def wei_animal(self,ani):
ani.chi()
zhu = Pig()
gou = Dog()
daxiang = Elephant()
syy = Siyangyuan()
syy.wei_animal(zhu)
syy.wei_animal(gou)
syy.wei_animal(daxiang)
多态的好处: 程序具有超强的可扩展性. 面向对象思想的核心与灵魂. python自带多态