• 初识面向对象


    一 面向对象和面向过程

      1.面向过程:一切以事物的流程为核心,核心是"过程"二字,过程是指解决问题的 步骤,即,先干什么,后干

            什么,基于该思想编写程序就好比在 编写一套流水线,是一种 机械式的编程思想

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

        缺点:可扩展性差

      2.面向对象:一切以对象为中心

        神马是对象? 

        总结: 具有相同属性和动作的结合体叫 对象.面向对象思维,要自己建立对象,自己建立场景,你就是

            面向对象世界中的玉皇大帝.

        优点: 可扩展性强

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

      来个对比吧:

        面向过程思维:

              说,把大象装冰箱总共分几步?  三步. 第一步,打开冰箱门,第二步,把大象装进去

               第三部,把冰箱门关上

        面向对象思维:

               造一个大象,说,大象去进冰箱,大象打开冰箱门,大象进冰箱,大象关冰箱门

    二,面向对象如何编写

      

    class 类名:
        pass
    # 这就是一个类 
    
    class Car:       # 注意 类的首字母 大写,也就是 遵循 驼峰  原则
        pass
    #  这就造了一个 车的 类
    
    c = Car()    
    # 创建了一辆车

       现在车有了,我们来装饰一下我们的爱车,给上个 颜色,车牌,排量 等等

    c.color = "red"
    c.pai = "京A88888"
    c.pailiang = "1.6T"
    print(c.color)
    print(c.pai)
    print(c.pailiang)
    
    # 我们使用 "对象.特征" ,可以给对象设置属性信息

      接下来,再造一辆车,并给车设置相关的属性信息

    c1 = Car()
    c1.color = "white"
    c1.pai = "京B66666"
    c1.pailiang = "1.8T"
    
    print(c1.color)
    print(c1.pai)
    print(c1.pailiang)

      我们发现 这两辆车是完全不相同的两辆车,但是,拥有相同的属性和信息,是不是有点冗余了,怎么办??

      我们把 车的 信息写入类里,会不会更好呢?而且,我的车在创建的时候,这些信息应该是已经设计好了的

      ,不应该是后天设计的,好了,我们知道需求了,在创建对象的时候,能给对象设置一些初始化的属性信息

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

    class Car:
        def __init__(self,color,pai,pailiang):
            # self 表示当前类的对象,当前你创建的谁,谁访问这个方法,那这个self就是谁
            self.color = color
            self.pai = pai
            self.pailiang = pailiang
    
    c1 = Car("红色","新J66666","2.0T")
    c2 = Car("绿色","新J88888","206T")
    
    print(c1.color)    # 红色
    print(c2.color)    # 绿色
    
    # 通过打印,我们发现,这两个对象原来可以这样完成属性的设置

      现在车的属性设置好了,那现在我想让我的车跑,可以吗? 答案是肯定的,那我的车能飞嘛? 答案依然是肯定

      的.那么 跑 和 飞 是什么?/ 是一个动作吧,所以我们把 跑和飞 写成一个函数,但是在面向对象编程中,我们

      不应该叫函数,改成 方法,只不过这个 方法写起来 比正常的 函数多了一个参数 self,仅此而已....

    class Car:
        def __init__(self,color,pai,pailiang):
            # self 表示当前类的对象,当前你创建的谁,谁访问这个方法,那这个self就是谁
            self.color = color
            self.pai = pai
            self.pailiang = pailiang
    
        def run(self):
            print("我的车真的可以跑,哈哈哈")
    
        def fly(self):
            print("我的车还可以飞,哈哈哈真厉害...")
    
    c1 = Car("红色","新J66666","2.0T")
    c2 = Car("绿色","新J88888","206T")
    
    c1.run()  # 我的车真的可以跑,哈哈哈
    c2.fly()  #  我的车还可以飞,哈哈哈真厉害...

      总结:

        类与对象的关系:类是对事物的总结.抽象的概念,类用来描述对象

                对象是类的实例化结果,对象能执行哪些方法,都是由类来决定

                类中定义了什么功能,那对象就拥有什么功能

    三 面向对象 和 面向过程 大  PK

      那么面向对象和面向过程,哪个更好呢? 具体问题,具体分析,没有绝对的好与不好,这一点要注意

    还来装大象看下:

    1.面向过程

    # 非函数版
    print("开冰箱门")
    print("装大象")
    print("关冰箱门")
    
    # 函数版
    def open():
        print("开冰箱门")
    def zhuang():
        print("装大象")
    def close():
        print("关冰箱门")
    
    open()
    zhuang()
    close()

    2.面向对象

    class Elephant:
        def __init__(self):
            pass
    
        def open(self):
            print("大象打开冰箱门")
        def zhuang(self):
            print("大象自己进冰箱")
        def close(self):
            print("大象关冰箱门")
    elp = Elephant()
    elp.open()
    elp.zhuang()
    elp.close()

    # 面向对象 主体是 大象,所有的动作 都是大象自己 主动完成的

      孙悟空大战葫芦娃,有一个小猴,叫悟空,会使用 瞪着眼睛看 必杀技

      1.面向过程

    def func1(name,age,bsj):
        print("%s,今年%s岁了,使用%s 必杀技,疯狂输出大娃" % (name,age,bsj))
    def func2(name,age,bsj):
        print("%s,今年%s岁了,使用%s 必杀技,疯狂输出二娃" % (name,age,bsj))
    def func3(name,age,bsj):
        print("%s,今年%s岁了,使用%s 必杀技,疯狂输出三娃" % (name,age,bsj))
    
    func1("悟空",500,"登着眼睛看")
    func2("悟空",500,"登着眼睛看")
    func3("悟空",500,"登着眼睛看")
    
    # 悟空,今年500岁了,使用登着眼睛看 必杀技,疯狂输出大娃
    # 悟空,今年500岁了,使用登着眼睛看 必杀技,疯狂输出二娃
    # 悟空,今年500岁了,使用登着眼睛看 必杀技,疯狂输出三娃

      2.面向对象

    class Monkey:
        def __init__(self,name,age,bsj):
            self.name = name
            self.age = age
            self.bsj = bsj
    
        def big(self):
            print("%s,今年%s 岁了,使用他的 %s 必杀技,疯狂输出大娃" % (self.name,self.age,self.bsj))
    
        def sec(self):
            print("%s,今年%s 岁了,使用他的 %s 必杀技,疯狂输出大娃" % (self.name, self.age, self.bsj))
    
        def three(self):
            print("%s,今年%s 岁了,使用他的 %s 必杀技,疯狂输出大娃" % (self.name, self.age, self.bsj))
    
    m = Monkey("悟空",500,"瞪着眼睛看")
    m.big()
    m.sec()
    m.three()
    
    # 悟空,今年500 岁了,使用他的 瞪着眼睛看 必杀技,疯狂输出大娃
    # 悟空,今年500 岁了,使用他的 瞪着眼睛看 必杀技,疯狂输出大娃
    # 悟空,今年500 岁了,使用他的 瞪着眼睛看 必杀技,疯狂输出大娃

      在这个 实例 中,我们都会觉得 面向对象 的 思维更加清晰一些,代码也更容易编写一些,所以,用哪种

        编程思想不是绝对的,要根据需求和需要来完成,具体问题具体分析嘛!!!

    四 面向对象三大特征

      面向对象三大特征:封装,继承,多态,只要是面向对象编程语言,都有这三个特征

      1.封装: 把很多数据封装到一个对象中,把固定功能的代码封装到一个代码块,函数,对象,打包成模块

          这都属于封装的思想

      2.继承:子类可以自动拥有父类除了 私有属性外的其他所有内容.

          在类名的后面添一个小括号,小括号写入你要继承的类名,就完成了继承关系

          类的继承顺序是先在自己类里找,找不到去父类里找,就近原则

    来看一段代码:

    class Yao:
        def chi(self):
            print("妖精都是会吃人的")
    
    class Xyao(Yao):
        pass
    
    xy = Xyao()
    xy.chi()      # 妖精都是会吃人的

      在 python 中,一个类可以同时继承 多个父类

    class Qindie:
        def chi(self):
            print("亲爹给你好吃的")
    
        def play(self):
            print("亲爹会陪你玩")
    
    class Gandie:
        def money(self):
            print("干爹给钱啊")
    
        def play(self):
            print("干爹也会陪你玩")
    
    class Girl(Qindie,Gandie):
        pass
    
    xiaohua = Girl()
    xiaohua.chi()
    xiaohua.play()
    xiaohua.money()
    
    # 亲爹给你好吃的
    # 亲爹会陪你玩
    # 干爹给钱啊

      具体的MRO((method resolution order)算法,我们到后面会具体的进行分析和讲解

      3.多态: 同一个对象,多种形态.这个在 python中是很不容易说明白的,因为我们一直在用,只是没有具体

          的说,比如,我们创建一个变量 a = 10,此时我们知道 a 是整型,但是我们可以通过程序让

          a = "哈哈哥" ,这时,a 又变成了 字符串,这是我们都知道的,但是,我要告诉你,这就是多态性

          同一个变量可以有 多种形态,接下来 让我们 看一个程序.

          饲养员  哈哈哥 的一天的工作,从早上开始喂猪,中午喂哈士奇,晚上喂阿拉斯加

    class Animal:
        def chi(self):
            print("我会吃")
    
    class Pig(Animal):
        def chi(self):
            print("猪在吃")
    
    class Hasiqi(Animal):
        def chi(self):
            print("哈士奇在吃")
    
    class Alasika(Animal):
        def chi(self):
            print("阿拉斯加在吃")
    class Syy:
        def wei_animal(self,ani):
            ani.chi()
    
    zhu = Pig()
    erha = Hasiqi()
    als = Alasika()
    
    hahage = Syy()
    hahage.wei_animal(zhu)
    hahage.wei_animal(erha)
    hahage.wei_animal(als)
    
    # 猪在吃
    # 哈士奇在吃
    # 阿拉斯加在吃

      多态的好处: 程序具有超高的可扩展性,面向对象思想的核心和灵魂,python自带多态

  • 相关阅读:
    vsftp 虚拟用户测试
    RHEL7 MariaDB测试
    安装xenapp后,非管理员连接RDP出现桌面当前不可用的解决方法
    sqrt函数的实现
    O2O、C2C、B2B、B2C
    libsvm使用说明
    如何确定最适合数据集的机器学习算法
    知乎日报:她把全世界的学术期刊都黑了
    逻辑回归应用之Kaggle泰坦尼克之灾
    非均衡数据分布的分类问题
  • 原文地址:https://www.cnblogs.com/wenqi2121/p/10316256.html
Copyright © 2020-2023  润新知