zoukankan      html  css  js  c++  java
  • Day16--Python--初识面向对象

    今日主要内容
    一. 面向对象思想
    1. 面向过程. 重点在'过程'. 按照事物迭代发展流程.
    优点: 简单,流水线式的操作
    缺点: 可扩展性差.可维护性差.
    2. 面向对象. 对象是属性和动作的集合体.对象是一个抽象概念
    重点在'对象':属性和动作.
    (先创建一个大象,然后让大象进冰箱就可以了,具体大象如何进的冰箱由大象来完成.)
    类似上帝式思维.

    优点: 可扩展性强(多态)
    缺点: 编写相对比较复杂. 上手比较难.

    面向对象和面向过程各有千秋

    二. 面向对象如何编写
    在代码中定义一个类,相当于画图纸
    class 类名: #驼峰,类名首字母大写
    pass

    创建对象: 类名()
    1. 构造方法:
    def __init__(self, 属性):
    self.属性 = 属性
    2. 普通方法
    def 方法名(self, 参数列表):
    pass
    self: 表示当前类的对象. 当前正在执行这个动作的对象.
    对象.方法()
    类名.方法(对象,参数)

    e.g.
    #定义一辆车
    class Car:
    #出厂设置 (__init__) 构造方法,所有方法的第一个参数不用给
    def __init__(self, colour, pai, pailiang, own) #self 表示当前类的对象
    print('我在造车')
    print(self)
    #绑定属性.
    # self.colour = '红色'
    # self.pai = '京A66666'
    self.colour = colour
    self.pai = pai
    self.pailiang = pailiang
    self.own = own

    c = Car('黑色', '黑B88888', '2.0t', 'alex')
    c1 = Car() 系统会自动调用__init__方法.并将Car()传给self
    c2 = Car() 自动调用__init__函数(方法)

    #创造一辆车,创建对象
    c= Car() #类名()
    print(type(c)) #<class '__main__.Car'>


    c1 = Car() #创建新对象,又叫做实例化 #类是一个概念. 对象:具体的实例
    c1.colour = '白色'
    c1.pai = '京B22222'
    c1.pailiang = '1.6t'
    c1.own = '小猪佩奇'
    print(id(c), id(c1))
    print(c1.pai)
    print(c.own)

    #函数(方法)

    class Car():
    def __init__(self, colour, pai, pailiang, own):
    self.colour = colour
    self.pai = pai
    self.pailiang = pailiang
    self.own = own

    #车能跑,跑是一个动作,要写函数(方法)
    def run(self): #self: 当前类的对象
    print('%s颜色的车在疯狂的跑' % self.colour)
    print(self)

    c1 = Car('红','京A11111', '1.5L', '小猪佩奇')
    c1.run() #对象,方法() 用谁访问,self就是谁



    --------------------------------------
    class House:
    pass


    h = House()
    h.colour = '红色'
    h.size = '500平米'
    h.floor = '两层'
    h.owner = 'Sara'

    print(type(h))

    h1 = House()
    h1.colour = '白色'
    h1.size = '250平米'
    h1.floor = '1层'
    h1.owner = 'John'

    print(id(h), id(h1))
    print(h1.colour)
    print(h.colour)

    --------------------------------------------
    class Meal:
    def __init__(self):
    self.food = '米饭'
    self.dish = '鱼香肉丝'
    self.drink = '可乐'

    m = Meal()
    print(m.food)
    m.dish = '宫保鸡丁'
    print(m.dish)

    m1 = Meal()
    print(m1.dish)

    ---------------------------------------------
    class House:
    def __init__(self, colour, size, floor, owner):
    self.colour = colour
    self.size = size
    self.floor = floor
    self.owner = owner

    H1 = House('红色', '1000平米', '4层', '王尔德')
    print(H1)
    print(H1.colour)
    print(H1.size)

    H2 = House('米黄', '500平米', '2层', '布莱曼')
    print(H2.colour)
    print(H2.size)
    print(H2)

    class HaoHan: # 驼峰. 类名首字母大写.
        def __init__(self, name, waihao, jineng):
            self.name = name
            self.waihao = waihao
            self.jineng = jineng
    
        def ganLaoHu(self):
            print("%s, %s 在干老虎" % (self.waihao, self.name))
    
        def shaSaoZi(self):
            print("%s, %s 在杀嫂子" % (self.waihao, self.name))
    
        def tiTianXingDao(self):
            print("%s, %s 在替天行道" % (self.waihao, self.name))
    
    wusong = HaoHan("武松", "行者", "喝酒")
    
    wusong.ganLaoHu()
    wusong.shaSaoZi()
    wusong.tiTianXingDao()
    View Code构造方法
    class HeShang:
    
        def __init__(self, fahao, mingzi, age, miao):
            self.fahao = fahao
            self.mingzi = mingzi
            self.age = age
            self.miao = miao
    
        def nianjing(self):
            print("%s在念经" %  self.fahao)
    
        def quxifu(self, xifu):
            print("%s取了个媳妇:%s" % (self.fahao, xifu))
    
    hs = HeShang("秃驴", "alex", 38, "路飞庙")
    hs.nianjing()
    hs.quxifu("wusir")
    View Code普通方法
    class Account:
        
        def __init__(self, username, pwd):
            self.username = username
            self.pwd = pwd
            
        def login(self):
            if self.username == 'alex' and self.pwd == '123':
                return True
            else:
                return False
    
    acc = Account('alex', '123')
    print(acc.login())
    View Code用户登录


    三. 面向对象和面向过程的对比(代码,思想)
    结论: 根据不同的业务逻辑, 来决定用哪种思想.

    面向对象PK面向过程
    装大象, 脚本
    print("打开冰箱门")
    print("装大象")
    print("关上冰箱门")
    
    函数式编程
    def kaimen():
        print("打开冰箱门")
    def zhuangdaxiang():
        print("装大象")
    def guanmen():
        print("关门")
    kaimen()
    zhuangdaxiang()
    guanmen()
    
    
    面向对象
    class Elephant:
    
        def open(self):
            print("大象会开门")
        def zhuang(self):
            print("把自己装进去")
        def close(self):
            print("把门关上")
    
    # 创建大象
    e = Elephant()
    e.open()
    e.zhuang()
    e.close()
    
    # 第一回合. 面向过程赢
    View Code
    # 第二回合. 小猪佩奇(name, age, 技能)大战奥特曼, 蜘蛛侠, 蝙蝠侠
    # 函数式
    def da_ao_te_man(name, age, jineng):
        print("%s, %s岁了, 用技能%s 打奥特曼" % (name, age, jineng))
    def da_zhi_zhu_xia(name, age, jineng):
        print("%s, %s岁了, 用技能%s 打蜘蛛侠" % (name, age, jineng))
    def da_bian_fu_xia(name, age, jineng):
        print("%s, %s岁了, 用技能%s 打蝙蝠侠" % (name, age, jineng))
    
    da_ao_te_man("小猪佩奇", 40, "嘴巴嘟嘟")
    da_zhi_zhu_xia("小猪佩奇", 40, "嘴巴嘟嘟")
    da_bian_fu_xia("小猪佩奇", 40, "嘴巴嘟嘟")
    
    
    # 面向对象
    class Pig:
    
        def __init__(self, name, age, jineng):
            self.name = name
            self.age = age
            self.jineng = jineng
    
        def da_ao_te_man(self):
            print("%s, %s岁了, 用技能%s 打奥特曼" % (self.name, self.age, self.jineng))
        def da_zhi_zhu_xia(self):
            print("%s, %s岁了, 用技能%s 打蜘蛛侠" % (self.name, self.age, self.jineng))
        def da_bian_fu_xia(self):
            print("%s, %s岁了, 用技能%s 打蝙蝠侠" % (self.name, self.age, self.jineng))
    
    peiqi = Pig("小猪佩奇", 40, "嘴巴嘟嘟") # 把这三个属性封装到了一个对象里.
    peiqi.da_ao_te_man()
    peiqi.da_zhi_zhu_xia()
    peiqi.da_bian_fu_xia()
    
    
    # 平手. 当属性和方法非常多的时候, 才能感觉到面向对象的好.
    # 你要知道. 面向对象和面向过程都是思想. 用哪一个取决于业务逻辑.
    View Code



    四. 面向对象的三个特征(记下来)
    1. 封装: 把具有相同属性和功能的内容封装在一个对象中
    2. 继承: 子类可以自动拥有父类中 除了私有属性外的其他所有内容. 好处:两个类具有相同的功能或特征时,可以避免写很多重复的功能和代码.
    3. 多态: 同一类的对象. 可以拥有多种形态,本质是子类通过重写父类的方法,使得对同一类对象调用同一个方法,产生不同结果. python原生自带多态性. e.g.父类中定义了eat方法,子类中又重新定义了eat方法.

    继承
    class Fa:
        def play(self):
            print('Fa中的play')
        def func(self):
            print('我是一号')
    
    class Fa2:
        def play(self):
            print('Fa2中的play')
        def tool(self):
            print('我是2号')
    
    class Son(Fa, Fa2):   #可以从多个类中继承,调用顺序先找自己,再从左到右按顺序继承
        pass
    
    s = Son()
    s.func()
    s.tool()
    s.play()
    View Code一个子类继承多个父类
    class Pet:
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print('')
        def sleep(self):
            print('')
    
    class Cat(Pet):
        def catch_mouse(self):
            print('%s喜欢抓老鼠' % self.name)
    
    class Dog(Pet):
        def chaijia(self):
            print('%s喜欢拆家' % self.name)
    
    c = Cat('Tom')
    c.catch_mouse()
    c.eat()
    c.sleep()
    
    d = Dog('John')
    d.chaijia()
    d.eat()
    d.sleep()
    View Code多个子类继承一个父类

     多态

    # # 变量 = 类名()
    # c = Cat() # 猫类型的
    # python本来就是多态. 里面没有所谓的类型.
    
    class Animal:
        def chi(self):
            print("所有的动物都会吃")
    
    class Haski(Animal):
        def chi(self):
            print("疯了一样的吃")
    
    class Monkey(Animal):
        def chi(self):
            print("龇牙咧嘴的吃")
    
    class Tiger(Animal):
        def chi(self):
            print("跟猫一样的吃")
    
    class Elephant(Animal):
        def chi(self):
            print("大象用鼻子卷着吃")
    
    class YingWu(Animal):
        def chi(self):
            print("xxxxx")
    
    
    class SiYangYuan:
        def wei(self, ani):  # 多态性. 超强的可扩展性. 不论传递进来的是什么. 都统一当成动物来对待.
            ani.chi()
    
    syy = SiYangYuan()
    
    # 造动物
    hou = Monkey()
    ha = Haski()
    lao = Tiger()
    yw = YingWu()
    
    syy.wei(ha)
    syy.wei(hou)
    syy.wei(lao)
    syy.wei(yw)
    View Code
    class Car:
        def run(self, speed):
            print("车能跑%s迈" % speed)
    
    c = Car() # 实例化一个对象
    Car.run(c, 50)
    c.run(50)
    View Code 类.动作(对象,参数) = 对象.动作(参数)
  • 相关阅读:
    170601、单例模式的三种水平代码(第三种最佳)
    解决打开pycharm有带图片md文件卡死问题
    Dockerfile 操作
    Docker 命令大全
    MAC
    mac 搭建selenium与ChromeDriver环境
    Mac进行 usr/bin 目录下修改权限问题,operation not permitted
    pytest文档6-fixture之yield实现teardown
    pytest文档5-fixture之conftest.py
    pytest文档4-测试用例setup和teardown
  • 原文地址:https://www.cnblogs.com/surasun/p/9699623.html
Copyright © 2011-2022 走看看