# -*- coding: utf-8 -*-
# @Time    : 2020/01/19 9:38
# @Author  : xianming yu
# @File    : 1面向对象(oop)基本概念.py

"""
面向对象编程--Object Oriented Programming 简写 OOP
开始学习!
"""
"""
目标:
    了解面向对象基本概念
01.面向对象基本概念
   i 我们之前学习的编程方式就是面向过程的
   i1 面向过程和面向对象,是两种不同的编程方式
   i2 对比面向过程的特点,可以更好地了解什么是面向对象

1.1过程和函数(科普)
    i 过程:是早期的一个编程概念
    i1 过程:类似与函数,只能执行,但是没有返回值
    i2 函数:不仅能执行,还可以有返回结果
1.2面向过程和面向对象基本概念
    i 面向过程--怎么做?
        1.把完成某一个具体的需求,所有步骤从头到尾逐步实现
        2.根据开发需求,将某些功能独立的代码封装成一个又一个的函数
        3.最后完成的代码,就是顺序的调用不同的函数
    i1 特点
        1.注重步骤与过程,不注重职责分工
        2.如果需求复杂,代码会变的很复杂
        3.开发复杂的项目,没有固定的套路,开发难度很大
1.3面向对象--谁来做?
    i 相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法
        1.在完成某一个需求前,首先确定职责--要做的事情(方法)
        2.根据职责确定不同的对象,在对象内部封装不同的方法(多个方法)
        3.最后完成的代码,就是顺序地让不同的对象调用不同的方法
    i1 特点
        1.注重对象和职责,不同的对象承担不同的职责
        2.更加适用复杂的需求变化,是专门应对复杂项目开发,提供固定套路
        3.需要在面向过程基础上,再学习一些面向对象的语法
    i2 例子(植物大战僵尸)
        向日葵(生命值\生产阳光(),摇晃())
            理解:向日葵这个对象里面封装了两个方法:生产阳光()和摇晃()和一个属性:生命值
        豌豆射手(生命值\发射子弹())
        冰冻射手(生命值\发射冰冻子弹())
        普通僵尸(生命值\咬(),移动())
        铁桶僵尸((生命值\铁桶)\咬(),移动())
        跳跃僵尸((生命值\竹竿)\咬(),跳(),移动())      
"""

"""
类和对象
    i 目标
        1.类和对象的概念
        2.类和对象的关系
        3.类的设计
    i1 类和对象的概念
        类和对象是面向对象编程的两个核心概念
        i1.1 类
            类:是一群具有相同特征或者行为的事务的一个统称,是抽象的,不能直接使用
                特征:被称为属性
                行为:被称为方法
            类:就相当于制造飞机时的图纸,是一个模板,是负责创建对象的
        i1.2 对象
            1.对象:是由类创建出来的一个具体存在,可以直接使用
            2.由哪一个类创建出来的对象,就拥有在哪一个类中定义的:
                1.属性
                2.方法
            3.对象:就相当于用图纸制造的飞机
        i1.3 重点
            在程序开发中,应该先有类,再有对象
    i2 类和对象的关系
        i2.1 类是模板,对象是根据"类"这个模板创建出来的,应该现有类,再有对象
        i2.2 类只有一个,而对象可以有很多个
            不同的对象之间属性,可能各不相同
        i2.3 类中定义了什么属性和方法,对象中就有什么属性和方法,不可能多,也不可能少
    i3 类的设计
        在使用面向对象开发前,应该首先分析需求,确定一下,程序中需要包含那些类
        如下:
            向日葵(生命值\生产阳光(),摇晃())
            理解:比喻向日葵类创建出来的是向日葵对象
            豌豆射手(生命值\发射子弹())
            冰冻射手(生命值\发射冰冻子弹())
            普通僵尸(生命值\咬(),移动())
            铁桶僵尸((生命值\铁桶)\咬(),移动())
        在程序开发中,要设计一个类,通常需要满足以下三个要素
            1.类名:这类事物的名字,满足大驼峰命名法
            2.属性:这类事物具有什么样的特征
            3.方法:这类事物具有什么样的行为
        大驼峰命名法
            CapWords
            1.每个单词的首字母大写
            2.单词与单词之间没有下划线
        i3.1 类名的确定
            名词提炼法,分析整个业务流程,出现的名词,通常就是找到的类
        i3.2 属性和方法的确定
            对象的特征描述,通常可以定义成属性
            对象具有的行为(动词),通常可以定义成方法
                提示:需求中没有涉及的属性或者方法在设计类时,不需要考虑
        练习题1
            需求如下:
                1.小明今年18岁,身高1.75,每天早上跑完步,会去吃东西
                2.小美今年17岁,身高1.65,小美不跑步,小美喜欢吃东西
            分析练习题:
                1.在练习题1当中小明和小美都是属于人类,而人类是属于名词,提炼出来名词后,我们就可以定义类
                2.描述小明和小美的特征(属性)的是:姓名,年龄,身高
                3.描述小明和小美具体行为为(方法)的是:跑步和吃东西
            总结:
                Person(类名)
                属性如下:
                name
                age
                height
                行为如下:
                run()
                eat()
        练习题2
            需求如下:
                1.一只黄颜色的狗狗叫大黄
                2.看见生人汪汪叫
                3.看见家人摆尾巴
                Dog()类名
                属性(特征)
                name 名字
                color 颜色
                方法(行为)
                shout() 汪汪叫
                shake() 摇尾巴
                
            
                
                
                
                       
        
        
        
        
        
        
        
        
        
"""