zoukankan      html  css  js  c++  java
  • python D15 面向对象

    # 本节主要内容:
    # 1、面向对象
    # 2、面向对象如何编写
    # 3、面向对象和面向过程大pk
    # 4、面向对象三大特征

    # 一、面向对象和面向过程
    # 1. ⾯向过程: ⼀切以事物的流程为核⼼. 核⼼是"过程"⼆字, 过程是指解决问题的步骤,
    # 即, 先⼲什么, 后⼲什么. 基于该思想编写程序就好比在编写⼀套流⽔线. 是⼀种机械
    # 式的编程思维
    # 面向过程:站在自己的角度先做什么后做什么,主要在过程上面
    # 优点: 负责的问题流程化, 编写相对简单
    # 缺点: 可扩展性差

    # 2. ⾯向对象: ⼀切以对象为中⼼.
    # 什么是对象? 不好解释. 先解释解释什么是⻋? 有轱辘, 有⽅向盘, 有发动机, 会跑的
    # 是⻋. 好. 在解释⼀个. 什么是⼈. 有名字, 年龄, 爱好, 会唱歌跳舞思考的是⼈. 我们给这两个
    # 东⻄下了⼀个简单的定义. 总结: 具有相同属性和动作的结合体叫对象. ⾯向对象思维, 要⾃
    # ⼰建立对象. ⾃⼰建立场景. 你是就是⾯向对象世界中的上帝. 你想让⻋⼲嘛就⼲嘛. 你想让
    # ⼈⼲嘛⼈就能⼲嘛.
    # 面向对象:站在上帝视角,以对象为中心,命令对象去做什么
    # 优点: 可扩展性强
    # 缺点: 编程的复杂度⾼于⾯向过程

    # 对比:
    # 说. 要把⼤象装冰箱, 总共分⼏步? 三步. 第⼀步. 打开冰箱⻔, 第⼆部. 装⼤象, 第三
    # 部. 关冰箱⻔. 这是⼀个典型的⾯向过程的思维⽅式. 来我们如果换成⾯向对象呢? 很简单. 想
    # 办法造⼀个会钻冰箱的⼤象就可以了. 然后命令⼤象. 进冰箱. ⼤象就乖乖的进冰箱了. 这就
    # 是⾯向对象思维. 我们⾯向的不再是事物发展的流程, ⽽是操纵某⼀个事物的个体. 具体的某
    # ⼀个事物.

    # 二、面向对象如何编写
    # 说了这么多. ⾯向对象的程序如何编写呢? 想想在我们的世界中. 我们如何造⼀辆⻋?
    # 先由设计师来设计图纸. 设计师在图纸上勾勒出⻋应该是xx样的. 应该有什么. 以及这台⻋的
    # 功能等等. 然后交给⼯⼚进⾏代⼯. 根据设计师设计的图纸去创造⻋. 程序也⼀样. 我们需要
    # 先设计⼀个图纸. 在图纸上把我要创建的对象进⾏描述. 然后交给⼯⼈去创建对象.
    # 在这⾥, 我们画图纸的过程需要我们写类, 我们⽤类来描述⼀个对象. 类的语法很简单
    # class girlfriend: # 这里就创建了一个类
    # pass
    # gf = girlfriend() # 这里就创建了一个对象
    # gf.foot = "大长腿" # 对象的属性
    # gf.eyes = '大眼睛'
    # gf.hair = '乌黑大长发'
    # gf.bosom = '35D'
    # gf.type = "sexy"
    # 接下来, 再造⼀gf, 并给gf设置相关的属性信息
    # gf2 = girlfriend()
    # gf2.foot = "大长长腿"
    # gf2.eyes = '大眼睛'
    # gf2.hair = '乌黑大长发'
    # gf2.bosom = '36D'
    # gf2.type = "chubby"
    # print(gf2.type)

    # 我们发现, 这两量gf是完全不同的两量gf. 但是. 拥有相同的属性和信息. 是不是有点⼉
    # 冗余了? 怎么办呢? 想想. 我们把⻋的信息如果写在类⾥是不是会更好呢? ⽽且. 我的girkfirend在创
    # 建的时候这些信息应该已经是设计好了的. 不应该是后天设计的. 好了, 我们知道需求了, 在
    # 创建对象的时候能给对象设置⼀些初始化的属性信息. 在python中我们可以是⽤__init__(self)
    # 函数给对象进⾏初始化操作. 这个函数(⽅法)被称为构造函数(⽅法).
    # class girlfirend:
    # def __init__(self, foot, eyes, hair, bosom, type):
    # self.foot = foot
    # self.eyes = eyes
    # self.hair = hair
    # self.bosom = bosom
    # self.type = type
    # gf1 = girlfirend("大长腿", "大眼睛", "乌黑大长发", "35D", "sexy", )
    # print(gf1.type) # sexy
    # gf2 = girlfirend("大大长腿", "大大眼睛", "长发", "36D", "sexy", )
    # print(gf2.eyes) # 大大眼睛
    # 通过打印, 我们发现.这两个对象依然像原来那样可以完成属性的设置.

    # 属性设置完了. 接下来. ⻋不光有这些信息啊. ⻋还会跑呢. 跑是⼀个动作. 所以我们要
    # 把跑写成⼀个函数. 但是在⾯向对象编程中. 我们不应该叫函数了, 改成叫⽅法. 只不过这个
    # ⽅法写起来比正常的⽅法多⼀个参数self. 仅此⽽已
    # class Car:
    # def __init__(self, color, pai, pailiang): # self表示当前类的对象. 当前你创建的是谁, 谁来访问的这个⽅法.那这个self就是谁.
    # self.color = color
    # self.pai = pai
    # self.pailiang = pailiang
    # def run(self, speed):
    # print("⻋可以跑%s迈" % speed)
    # c = Car("red", "京A66666", "2.0T")
    # c.run(100) # ⻋可以跑100迈 这时. python会⾃动把对象c传递给run⽅法的第⼀个参数位置.
    # 总结: 类与对象的关系: 类是对事物的总结. 抽象的概念. 类⽤来描述对象. 对象是类的实例
    # 化的结果. 对象能执⾏哪些⽅法. 都由类来决定. 类中定义了什么. 对象就拥有什么

    # 练习:用面向对象思维拉完成用户登录
    # class uspas: # 创建一个登陆的类
    # def __init__(self, username, password): # 定义这个类自带的用户名、密码属性
    # self.username = username
    # self.password = password
    # def login(self, user, psw): # 定义登陆这个方法,用户传入账号密码
    # if user == self.username and psw == self.password: # 验证账号密码是否正确
    # return "登陆成功"
    # else:
    # return "用户名或密码错误"
    # usp = uspas("zhang", "hui123")
    # ret = usp.login(user=input("请输入你的账号"), psw=input("请输入你的密码"))
    # print(ret)

    # 三. ⾯向对象和⾯向过程⼤PK
    # 那么⾯向对象和⾯向过程到底哪个好? 具体问题. 具体分析. 没有绝对的好和不好. 这⼀点
    # 要格外注意.
    # 来. 我们来完成之前的装⼤象的程序:
    # 1、面向过程:
    # 非函数版
    # print("打开冰箱门")
    # print("装大象")
    # print("关冰箱门")
    # # 函数版
    # def open_d():
    # print("打开冰箱门")
    # def zx():
    # print("装大象")
    # def close_d():
    # print("关冰箱门")
    #
    # # 2、面向对象:
    # class El:
    # def open(self):
    # print("把门打开")
    # def zx(self):
    # print("把自己装进去")
    # def close(self):
    # print("关门")
    # dx = El()
    # dx.open()
    # dx.zx()
    # dx.close()
    # 发现了吧, ⾯向对象简直⿇烦到爆. 别着急. 接着看下⼀个案例.
    # ⼩猪佩奇⼤战奥特曼. 说. 有⼀个⼩猪, 名叫佩奇, 今年40岁了. 会使⽤嘴巴嘟嘟必杀技. 他
    # 不光⼤战奥特曼, 还会⼤战蝙蝠侠, 蜘蛛侠
    # def da_ao_te_man(name, age, jn):
    # print("%s, 今年%s岁了, 使⽤%s技能疯狂输出奥特曼" % (name, age, jn))
    # def da_bian_fu_xia(name, age, jn):
    # print("%s, 今年%s岁了, 使⽤%s技能疯狂输出蝙蝠侠" % (name, age, jn))
    # def da_zhi_zhu_xia(name, age, jn):
    # print("%s, 今年%s岁了, 使⽤%s技能疯狂输出蜘蛛侠" % (name, age, jn))
    # da_ao_te_man("⼩猪佩奇", 39, "嘴巴嘟嘟")
    # da_bian_fu_xia("⼩猪佩奇", 39, "嘴巴嘟嘟")
    # da_zhi_zhu_xia("⼩猪佩奇", 39, "嘴巴嘟嘟")

    # ⾯向对象
    # class Pig:
    # def __init__(self, name, age, jn):
    # self.name = name
    # self.age = age
    # self.jn = jn
    # def da_ao_te_man(self):
    # print("%s, 今年%s岁了, 使⽤%s技能疯狂输出奥特曼" % (self.name, self.age,self.jn))
    # def da_bian_fu_xia(self):
    # print("%s, 今年%s岁了, 使⽤%s技能疯狂输出蝙蝠侠" % (self.name, self.age,self.jn))
    # def da_zhi_zhu_xia(self):
    # print("%s, 今年%s岁了, 使⽤%s技能疯狂输出蜘蛛侠" % (self.name, self.age,self.jn))
    # peiqi = Pig("⼩猪佩奇", 39, "嘴巴嘟嘟")
    # peiqi.da_ao_te_man()
    # peiqi.da_bian_fu_xia()
    # peiqi.da_zhi_zhu_xia()
    # 感觉到⼀点⼉眉⽬了吧. 在这个案例中, 明显⾯向对象的思想更加清晰⼀些. 代码也更容
    # 易编写⼀些. 所以. ⽤哪种编程思想不是绝对的. 得根据需求和需要来完成.

    # 四. ⾯向对象的三⼤特征
    # ⾯向对象三⼤特征: 封装, 继承, 多态. 只要是⾯向对象编程语⾔. 都有这三个特征.
    # 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对
    # 象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了⼀个很⽜B
    # 的函数. 那这个也可以被称为封装. 在⾯向对象思想中. 是把⼀些看似⽆关紧要的内容
    # 组合到⼀起统⼀进⾏存储和使⽤. 这就是封装.
    # 2. 继承: ⼦类可以⾃动拥有⽗类中除了私有属性外的其他所有内容. 说⽩了, ⼉⼦可以
    # 随便⽤爹的东⻄. 但是朋友们, ⼀定要认清楚⼀个事情. 必须先有爹, 后有⼉⼦. 顺序不
    # 能乱, 在python中实现继承非常简单. 在声明类的时候, 在类名后⾯添加⼀个⼩括号,
    # 就可以完成继承关系. 那么什么情况可以使⽤继承呢? 单纯的从代码层⾯上来看. 两
    # 个类具有相同的功能或者特征的时候. 可以采⽤继承的形式. 提取⼀个⽗类, 这个⽗类
    # 中编写着两个类相同的部分. 然后两个类分别取继承这个类就可以了. 这样写的好处
    # 是我们可以避免写很多重复的功能和代码. 如果从语义中去分析的话. 会简单很多. 如
    # 果语境中出现了x是⼀种y. 这时, y是⼀种泛化的概念. x比y更加具体. 那这时x就是y的
    # ⼦类. 比如. 猫是⼀种动物. 猫继承动物. 动物能动. 猫也能动. 这时猫在创建的时候就
    # 有了动物的"动"这个属性. 再比如, ⽩骨精是⼀个妖怪. 妖怪天⽣就有⼀个比较不好
    # 的功能叫"吃⼈", ⽩骨精⼀出⽣就知道如何"吃⼈". 此时 ⽩骨精继承妖精. 话不多说.
    # 上代码.

    # 在python中, ⼀个类可以同时继承多个⽗类. 说⽩了, 现在⼀个⼉⼦可能会有多个爹了.
    # 既然是有这么多个爹, 总得有远有近. 比如. 有⼀个这样的⽜B的⼈物, 叫锅不美. 就有很多个
    # 爹嘛.
    class QinDie:
    def chi(self):
    print("亲爹给你好吃的")
    def play(self):
    print("亲爹会陪你玩")

    class GanDie:
    def qian(self):
    print("⼲爹给钱啊")
    def play(self):
    print("⼲爹会陪你玩")
    class GuNiang(QinDie, GanDie):
    pass
    bumei = GuNiang()
    bumei.chi() # 亲爹
    bumei.qian() # 亲爹没有, 找⼲爹
    bumei.play() # 亲爹有了, 就不找⼲爹了

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

    class Pig:
    def chi(self):
    print("猪也在吃")

    class Haski(Animal):
    def chi(self):
    print("哈⼠奇在吃")

    class Alasika(Animal):
    def chi(self):
    print("阿拉斯加在吃")

    class SiYangYuan:
    def yanng_animal(self, ani):
    ani.chi()

    zhu = Pig()
    erha = Haski()
    ala = Alasika()
    alex = SiYangYuan()
    alex.yanng_animal(zhu) # 猪也在吃
    alex.yanng_animal(erha) # 哈⼠奇在吃
    alex.yanng_animal(ala) # 阿拉斯加在吃
  • 相关阅读:
    tp5后台开发某些心得
    some note
    py数据抓取小案例(博客
    vue axios的使用
    C# WebApi POST 提交
    WebApi 返回Json
    C# WebApi 处理Area路径问题
    时间比较
    将多行数据合并为一列
    汉字转换拼音
  • 原文地址:https://www.cnblogs.com/z520h123/p/9917911.html
Copyright © 2011-2022 走看看