面向对象(上)

概述

面向过程:根据业务逻辑从上到下写垒代码

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

面向对象:对函数进行分类和封装,让开发“更快更好更强...”

面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。

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()

二、继承

在创建对象的时候调用

猜你喜欢

转载自www.cnblogs.com/HeavyShield/p/10838090.html