面向过程:根据业务逻辑从上到下写垒代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象:对函数进行分类和封装,让开发“更快更好更强...”
面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。
while True: if cpu利用率 > 90 %: # 发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90 %: # 发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 内存占用 > 80 %: # 发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接
随着时间的推移,开始使用了函数式编程,增强代码的重用性和可读性,就变成了这样:
def 发送邮件(内容) #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 while True: if cpu利用率 > 90%: 发送邮件(‘CPU报警‘) if 硬盘使用空间 > 90%: 发送邮件(‘硬盘报警‘) if 内存占用 > 80%: 发送邮件(‘内存报警‘)
今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面向对象编程也支持函数式编程
面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
# 创建类的关键字 class # Car表示类的名字 class Car(object): # self是特殊参数,必填 def move(self): print("车在移动")
car = Car()# 根据Car模型创建实例
car.move()#车在移动
诶,你在这里是不是有疑问了?使用函数式编程和面向对象编程方式来执行一个“方法”时函数要比面向对象简便
观察上述对比答案则是肯定的,然后并非绝对,场景的不同适合其的编程方式也不同。
总结:函数式的应用场景 --> 各个函数之间是独立且无共用的数据
面向对象的三大特性是指:封装、继承和多态。
一、封装
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
所以,在使用面向对象的封装特性时,需要:
第一步:将内容封装到某处
class Car(object):
# 构造方法 def __init__(self, user, car_name, car_id, ):# self.user = user self.car_name = car_name self.car_id = car_id def move(self): print("我是%s,我开着%s车,车牌号为%s,在马上上移动" % (self.user,self.car_name, self.car_id))
def __del__(self):
print("对象释放执行") obj_zhang = Car("张三","卡宴", 1212212)# 创建对象的时候,会调用__init__函数,会将obj_zhang会当作参数传到self,
obj_liu = Car("小刘","奔驰", 1212212)
obj_zhang.move()
obj_liu.move()
加法运算符重载
class Demo(): def __init__(self, obj): self.data = obj[:] def __add__(self, other): x = len(self.data) # self是demo_one y = len(other.data) # other是demo_two print("x", x) print("y", y) return "xxx" demo_one = Demo([1, 2, 3, 3]) demo_two = Demo([10, 20, 30]) demo_sum = demo_one + demo_two# 两个对象相加,调用这个类ohter方法 print(demo_sum)#xxx
索引和分片重载
# 索引和分片重载 class Demo(object): def __init__(self, obj): self.data = obj # print(self.data) def __getitem__(self, item): return self.data[item] def __setitem__(self, key, value): self.data[key] = value def __delitem__(self, key): del self.data[key] d_list = Demo([1, 2, 3, 4]) # __getitem__ # print(d_list[2]) # 切片会调用对象的__getitem__方法,将2当作参数床给item # for d in d_list: # print(d) # for循环会调用d_list对象的__getitem__方法,将d当作参数传给item # __setitem__ # d_list[3] = 666 # 将self.data列表,下标为3的值,改为666 # print(d_list.data) # __delitem__ del d_list[3] # 删除self.data下标为3的值 print(d_list.data)
__str__
# __str__ class Demo(object): def __str__(self): return "str" def __repr__(self): return "repr" d = Demo() print(d)
游戏人生程序
# -*- coding:utf-8 -*- # ##################### 定义实现功能的类 ##################### class Person: def __init__(self, na, gen, age, fig): self.name = na self.gender = gen self.age = age self.fight =fig def grassland(self): """注释:草丛战斗,消耗200战斗力""" self.fight = self.fight - 200 def practice(self): """注释:自我修炼,增长100战斗力""" self.fight = self.fight + 200 def incest(self): """注释:多人游戏,消耗500战斗力""" self.fight = self.fight - 500 def detail(self): """注释:当前对象的详细情况""" temp = "姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s" % (self.name, self.gender, self.age, self.fight) print temp # ##################### 开始游戏 ##################### cang = Person(‘苍井井‘, ‘女‘, 18, 1000) # 创建苍井井角色 dong = Person(‘东尼木木‘, ‘男‘, 20, 1800) # 创建东尼木木角色 bo = Person(‘波多多‘, ‘女‘, 19, 2500) # 创建波多多角色 cang.incest() #苍井空参加一次多人游戏 dong.practice()#东尼木木自我修炼了一次 bo.grassland() #波多多参加一次草丛战斗 #输出当前所有人的详细情况 cang.detail() dong.detail() bo.detail() cang.incest() #苍井空又参加一次多人游戏 dong.incest() #东尼木木也参加了一个多人游戏 bo.practice() #波多多自我修炼了一次 #输出当前所有人的详细情况 cang.detail() dong.detail() bo.detail()
二、继承
在创建对象的时候调用
原文:https://www.cnblogs.com/HeavyShield/p/10838090.html