类与对象 面向对象和面向过程对比 面向对象三大特征:封装 继承 多态

 初识面向对象
面向过程:
一切以事务的发展流程为中心.
面向对象:
一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象

打比方:
大象进冰箱
步骤: 第一步, 开门, 第二步, 装大象, 第三步, 关门

面向对象:大象, 你进冰箱.
此时主语是大象. 我操纵的是大象. 此时的大象就是对象

 

1. 面向过程: 一切以事物的流程为核心. 核心是"过程"二字, 过程是指解决问题的步骤, 即, 先⼲干什么, 后干什么. 基于该思想编写程序就好比在编写一套流水线. 是一种机械 式的编程思维

  优点: 负责的问题流程化, 编写相对简单

   缺点: 可扩展性差

2. ⾯向对象: ⼀切以对象为中心. 什么是对象? 不好解释. 先解释什么是车? 有轱辘, 有⽅方向盘, 有发动机, 会跑的 是车. 好 在解释一个. 什么是人. 有名字, 年年龄, 爱好, 会唱歌跳舞思考的是人. 我们给这两个 东⻄下了一个简单的定义. 总结: 具有相同属性和动作的结合体叫对象. 面向对象思维, 要自 ⼰建立对象. 自己建立场景. 你是就是面向对象世界中的上帝. 你想让车干嘛就干嘛. 你想让 人干嘛人就能干嘛.

  优点: 可扩展性强

  缺点: 编程的复杂度⾼高于面向过程

# 造车
c = Car()   # 类名()  # 创建对象
# 出厂之后进行改装
c.color = "红颜色"  # 对象.属性 点: 的  当属性不存在的时候. 添加一个属性
c.pai = "京A88888" # 对象.属性
c.pailiang = "555L" # 排量

print(c.color) # 此车是红颜色
print(c.pai)
print(c.pailiang)

c.color = "绿颜色" # 当属性存在的时候是修改属性信息.
# 对象.属性 = xxxx 设置属性信息

print(c.color)class Car: 
   

# 类名首字母大写, 严格遵守驼峰命名规范
# __init__方法是一个特殊的方法. 初始化方法. (构造方法)
#在python中我们可以是用__init__(self) 函数给对象进行初始化操作. 这个函数(方法)被称为构造函数(方法).
# 在创建对象的时候会自动的调用__init__() # self就是你创建出来的那个对象
def __init__(self, color, pai, pailiang): # init初始化方法. 在创建对象的时候. 默认执行这个函数 # print("我是init") # print("self = ", self) # self.color="红色" # 在出厂的时候都是红色 self.color = color self.pai = pai self.pailiang = pailiang # c.color = "红色" # 跑: 动作, 功能 -> 函数 # 在类中写的函数 -> 方法 # self 当前类的对象. def pao(self): # self是自动传递的. 不用管它 print("%s我的车能跑" % self.color) # self.color def jump(self): print("you jump, I jump")

 

 类. 对象      类就是对属性和方法的封装    
类:

就是图纸. 创建对象的第一步. 先画图纸.也就是先写类.
对象: 对象就是车. 通过图纸造出来的具体的东西. 通过类来创建对象

类与对象的关系: 

类是对事物的总结. 抽象的概念念. 类用来描述对象. 对象是类的实例化的结果.

对象能执行哪些方法. 都由类来决定. 类中定义了什么. 对象就拥有什么 
类是对xxx事物的归类.

写法:
__init__(self, 参数) 参数一般作为属性设置给对象. 对象就是self, 对属性的封装.

# 在python中我们可以是用__init__(self) 函数给对象进行初始化操作. 这个函数(方法)被称为构造函数(方法). 

def 方法(self, 参数): 方法. 第一个参数一般是固定的self. 当前类的对象.
pass

对象是xx类型的一个具体
创建对象: 类名()

 

创建类:
class 类名:

def __init__(self): # 初始化方法. 又被成为构造方法
self.属性 = 值
self.属性 = 值
self.属性 = 值

def fangfa(self):
方法体(函数体, return)

创建对象:
变量 = 类名() # 实例化 <-> 创建对象

变量.属性 # 访问对象的属性信息
变量.方法() # 访问类中的方法

 

 

面向对象和面向过程对比

大象装冰箱
脚本, 此时代码是最简单的.  不需要构思整个程序的概况
print("开门")
print("装大象")
print("关门")

函数式编程. 比脚本麻烦. 对功能有了概况.

def kai():
    print('开门')
def zhuang():
    print("装大象")
def guan():
    print('关门')

kai()
zhuang()
guan()

面向对象编程, 对整个系统进行分析. 分析出需要哪些对象. 然后给对象进行归类.
先写类. 然后使用类创建对象. 最后用对象去执行相关的操作
class Elephant:
    def __init__(self):
        print("创建了一个大象")

    def kai(self):
        print("开门")

    def zuan(self):
        print("大象进冰箱")

    def guan(self):
        print("大象把门带上")

dx = Elephant()
dx.kai()
dx.zuan()
dx.guan()

第一回合
脚本胜
函数侧重的是功能
面向对象侧重的是 归类

 

PK2回合
# 小猪佩奇. 使用嘴巴嘟嘟技能攻击 超人
# 小猪佩奇. 使用嘴巴嘟嘟技能攻击 蝙蝠侠
# 小猪佩奇. 使用嘴巴嘟嘟技能攻击 蜘蛛侠

# 面向过程: 代码非常的冗余. 尤其是参数
def fight_superman(name, jineng):
    print("%s使用%s攻击超人" % (name, jineng))

def fight_batman(name, jineng):
    print("%s使用%s攻击蝙蝠侠" % (name, jineng))

def fight_spiderman(name, jineng):
    print("%s使用%s攻击蜘蛛侠" % (name, jineng))


fight_superman('小猪佩奇', "嘴巴嘟嘟")
fight_batman('小猪佩奇', "嘴巴嘟嘟")
fight_spiderman('小猪佩奇', "嘴巴嘟嘟")


class Pig:
    def __init__(self, name, jineng):
        self.name = name
        self.jineng = jineng

    def fight_superman(self):
        print("%s使用%s攻击超人" % (self.name, self.jineng))

    def fight_batman(self):
        print("%s使用%s攻击蝙蝠侠" % (self.name, self.jineng))

    def fight_spiderman(self):
        print("%s使用%s攻击蜘蛛侠" % (self.name, self.jineng))


pg = Pig("小猪佩奇", "嘴巴嘟嘟")
# 不需要向原来一样传递一样的参数了
# 面向对象的程序: 结果相对清晰. 缺点: 代码量比原来大, 上手太难
pg.fight_batman()
pg.fight_spiderman()
pg.fight_superman()


如果写一个定时任务, 半夜12点. 给老板发送财务报表(一张图)
def send_email(address, name, title, content):
    print("发送邮件")

def send_wechat(wechat_num, name, title, content):
    print("发送微信")

def send_chat(wechat_num, name, title, content):
    print("发送短信")

def send_dd(wechat_num, name, title, content):
    print("发送钉钉")

def send_oa(wechat_num, name, title, content):
    print("发送OA")


class Messager:
    def __init__(self, name, title, content):
        self.name = name
        self.title = title
        self.content = content

    def send_email(self, address):
        print("发送邮件")

    def send_wechat(self, wechat_num):
        print("发送微信")

    def send_chat(self, phone_num):
        print("发送短信")

    def send_dd(self, dd_num):
        print("发送钉钉")

    def send_oa(self, oa_num):
        print("发送OA")


用面向对象就比面向过程稍微好一些.
  可维护性比原来好

python同时支持面向对象和面向过程:
面向过程: 应用程序相对比较小. 不需要大规模的设计
面向对象: 程序非常大. 项目管理 维护成本很高. 此时更适合用面向对象(结构)

java : 纯面向对象  => 可以把一个微型项目. 做成巨型项目

 

 

面向对象三大特征:封装 继承 多态

  1. 封装: 把很多数据封装到一个对象中. 把固定功能的代码封装到一个代码块, 函数, 对 象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如.你写了⼀个很⽜B 的函数. 那这个也可以被称为封装. 在面向对象思想中. 是把一些看似无关紧要的内容组合到一起统一进行存储和使用. 这就是封装.

# 封装:
# 1. 对属性的封装
# 2. 对功能的封装
# 3. 模块
# 4. 包

  2. 继承: ⼦类可以自动拥有父类中除了私有属性外的其他所有内容. 说白了, 儿子可以 随便用爹的东西. 但是朋友们, ⼀定要认清楚一个事情. 必须先有爹, 后有⼉子. 顺序不能乱, 在python中实现继承非常简单. 在声明类的时候, 在类名后面添加⼀个小括号, 就可以完成继承关系. 那么什么情况可以使⽤继承呢? 单纯的从代码层面上来看. 两 个类具有相同的功能或者特征的时候. 可以采⽤继承的形式. 提取⼀个⽗类, 这个父类中编写着两个类相同的部分. 然后两个类分别取继承这个类就可以了. 这样写的好处 是我们可以避免写很多重复的功能和代码. 如果从语义中去分析的话. 会简单很多. 如果语境中出现了了x是⼀种y. 这时, y是⼀种泛化的概念. x比y更加具体. 那这时x就是y的 ⼦类. 比如. 猫是⼀种动物. 猫继承动物. 动物能动. 猫也能动. 这时猫在创建的时候就 有了动物的"动"这个属性. 再比如, ⽩骨精是⼀一个妖怪. 妖怪天⽣生就有⼀个比较不好的功能叫"吃人",  白骨精⼀出⽣就知道如何"吃人". 此时 白骨精继承妖精. 话不多说上代码.

 

 在python中, ⼀个类可以同时继承多个父类. 说⽩了, 现在一个⼉子可能会有多个爹了. 既然是有这么多个爹,  总得有远有近. 比如. 有⼀个这样的牛B的人物, 叫锅不美. 就有很多个爹嘛.

 

 

# 当出现xxx是一种yyy类型的东西. 可以使用继承关系
# 猫是一种动物
class Animal:
    def dong(self):
        print("动物会动, 顾雍")

class Cat(Animal): # 子类其实是对父类的一种扩展
    def catchMouse(self):
        print("猫很皮, 抓老鼠")

# c = Cat()
# c.dong()
# c.catchMouse()

a = Animal() # 父类的对象不能执行子类中的功能
a.dong()   #动物会动, 顾雍
# a.catchMouse() # 创建的是动物. 动物不能执行抓老鼠

 

class Animal:
    def dong(self):
        print("动物会动, 顾雍")

class Cat(Animal): # 子类其实是对父类的一种扩展
    def dong(self): # 子类中写了和父类一模一样的方法. 这个叫方法的覆盖, 重写
        print("猫上蹿下跳")

    def catchMouse(self):
        print("猫很皮, 抓老鼠")

c = Cat() # 创建的是猫.
c.dong()  # 类中的方法的查询顺序. 先找自己, 然后再找父类
#猫上蹿下跳

 

# python支持多继承
class Foo1:
    def getMoney(self):
        print('给你个大嘴巴子')

    def play(self):
        print("玩儿")

class Foo2:
    def getMoney(self):
        print('给多点儿')

class Bar(Foo1, Foo2): # 离当前类最近的是亲爹, 后面的是干爹.
    pass

b = Bar()  # 就近原则,         MRO的C3算法
b.getMoney() # Foo2里的
#给你个大嘴巴子

 

3. 多态: 同⼀个对象, 多种形态. 这个在python中其实是很不容易说明白的. 因为我们一 直在用. 只是没有具体的说.  比如. 我们创建一个变量a = 10 , 我们知道此时a是整数 类型. 但是我们可以通过程序让a = "alex", 这时, a又变成了字符串类型.  这是我们都知道的. 但是, 我要告诉你的是. 这个就是多态性. 同一个变量a可以是多种形态. 可能 这样的程序和说法你还get不到具体什么是多态. 接下来. 我们来看一个程序. 北京动 物园饲养员alex⼀一天的⼯工作. 从早上开始喂养猪猪, 中午喂哈⼠士奇, 晚上还得喂阿拉斯加. 来我们⽤代码实现这样的代码: 

      多态的好处:  程序具有超高的可扩展性.  ⾯向对象思想的核心与灵魂. python⾃带多态. 

# 多态性: 同一个对象. 多种形态.
# python支持的是鸭子类型. 会嘎嘎叫的东西就是鸭子
# 为了程序能够正常执行. 本来需要传递进来一只鸭子. 但是我只需要传递一个会嘎嘎叫的东西就可以了

 优点:超强的可扩展性. 面向对象的核心就是多态

 

 

posted @ 2018-12-17 20:35  言吾  阅读(551)  评论(0编辑  收藏  举报