• PYTHON1.面向对象_day01


    课程:Python面向对象
    进度:day1

    主要内容:
    1. 面向对象的概念
    2. 面向对象的三大特性:封装、继承、多态
    3. 面向对象的技术特性
    4. 方法重载、运算符重载
    5. 面向对象的设计

    今天内容提要
    1. OOP概念:以对象为中心,关注功能、关注结果
      1)类和对象(重点)
       2)如何定义类(重点)
       3)类的构成(重点)
       4)封装(重点)
       5)继承(重点)

    今天内容
    1. 面向对象基本概念
       1)面向过程:考虑实现过程、考虑每一步如何做
            代码组织单位:函数

      2)面向对象
         a)提出的原因
             - 成本和可行性
             - 代码复用,提高开发效率
             - 软件既要保持稳定性,又要满足不断变更
               对扩展开放,对修改封闭
             - 面向过程方式,在某些领域有局限性

       b) 什么是面向对象
             - Object Orainted Programming(简写OOP)
                关注对象,把事物看做一个一个对象,以对象为中心
                把事物归纳成一个一个的类
             - 提供了另一种分析、解决问题的方式

       c) 优点
            - 思想方法层面:更有利于归纳、分析、解决问题
                                       更接近于人的思维方式
            - 技术层面
               重用性:有利于代码复用,提高开发效率
               扩展性:能够方便对现有代码进行扩展和改写
               灵活性:程序设计具有更多的灵活性、弹性

           - 适用场景
               面向过程:系统级软件,嵌入式
               面向对象:企业级应用,图形库,游戏

            - 类和对象 (重点)
               类(class):具有共同特征事物的统称。例如学生,汽车
               对象(object): 类当中一个特殊的个体,特定、具体的

           - 类的构成 (重点)
              属性:描述对象“有什么”,数据特征
              行为:描述对象“能干什么”,行为特征

           - Python中类的定义  (重点)
            
    class  ClassName([父类列表]):
         "类的代码"
         # 属性(一般通过__init__构造方法创建)
         # 方法1
         # 方法2
         # ......
              说明:  class              定义类的关键字
                           ClassName   类名称(一般以大写字符开头)
                           父类列表       发生继承时候,表示从哪个类继承

      1 # ellipse.py
      2 # 面向过程、面向对象编程比较
      3 # 计算椭圆周长、面积
      4 
      5 # 面向过程方式
      6 a = 2.0   # 短半径
      7 b = 3.0   # 长半径
      8 len = 2 * 3.14 * a + 4 * (b - a)
      9 print("a=%f, b=%f, len=%f" % (a,b,len))
     10 
     11 area = 3.14 * a * b
     12 print("a=%f, b=%f, area=%f" % (a,b,area))
     13 
     14 # 面向对象方式
     15 class Ellipse:   # 定义椭圆类
     16     #类中的函数, 称之为方法
     17     def __init__(self, a, b):  # 构造方法
     18         self.a = a   # 属性:短半径
     19         self.b = b   # 属性:长半径
     20     # 2 * pi * 短半径 + 4(长半径 - 短半径)
     21     def calc_len(self): #计算周长
     22         return 2 * 3.14 * self.a + 
     23                4 * (self.b - self.a)
     24 
     25     def calc_area(self): #计算面积
     26         return 3.14 * self.a * self.b
     27 
     28 e = Ellipse(2.0, 3.0)  # 实例化:创建椭圆对象
     29 len = e.calc_len()     # 获得椭圆周长
     30 area = e.calc_area()   # 获得椭圆面积
     31 print("a=%f,b=%f, len=%f, area=%f" %
     32       (e.a, e.b, len, area))
     33 
     34 
     35 
     36 
    circle.py

    circle

      - 示例:定义一个汽车类(AutoMobile)
                         代码见auto_mobile.py

      1 # auto_mobile.py
      2 # 汽车类
      3 import random
      4 class AutoMobile:
      5     # 构造方法,主要作用是对属性进行初始化
      6     def __init__(self, name,
      7                  color, output_volumn):
      8         self.name = name    # 名称
      9         self.color = color  # 颜色
     10         self.output_volumn = output_volumn#排量
     11         self.__distance = 0.00  # 私有属性
     12         self.__fuel_cons = 8.0  # 每百公里耗油量
     13 
     14     def __calc_distance(self): # 计算行驶里程方法
     15         dist = random.randint(1,400)
     16         self.__distance += dist  # 改变行驶里程
     17 
     18     def get_distance(self):  # 获得行驶里程
     19         return self.__distance  # 返回行驶里程属性
     20 
     21     def startup(self): # 启动方法
     22         print("汽车启动")
     23 
     24     def run(self):  # 行驶方法
     25         self.__calc_distance()  # 调用行驶里程计算方法
     26         real_fuel_con = self.__fuel_cons / 100 
     27                         * self.__distance
     28         print("汽车行驶了%.2f公里,油耗%.2f升" %
     29             (self.__distance, real_fuel_con))
     30 
     31     def stop(self):  # 停止方法
     32         print("汽车停止")
     33 
     34     def info(self):  # 打印汽车信息
     35         print("名称:%s,颜色:%s,排量:%.2f" 
     36              %(self.name, self.color, 
     37              self.output_volumn))
     38 
     39 if __name__ == "__main__":
     40     # 实例化:根据类创建对象(根据模型制作具体产品)
     41     am = AutoMobile("家用轿车", "红色", 2.0)
     42     am.startup()   # 启动汽车(调用汽车方法)
     43     am.run()       # 行驶
     44     am.stop()      # 停止
     45     am.info()      # 查看汽车对象信息
     46     # 通过调用get_distance()获取行驶里程
     47     print("行驶里程:%.2f" % am.get_distance())
     48 
     49 
     50 
    auto_mobile.py
      1 # car.py
      2 # 家用小汽车类,继承示例
      3 from auto_mobile import *
      4 
      5 # 定义Car类,继承自AutoMobile类
      6 class Car(AutoMobile):
      7     pass
      8 
      9 if __name__ == "__main__":
     10     mycar = Car("小汽车", "蓝色", 1.40)
     11     mycar.startup()  #启动
     12     mycar.run()      #行驶
     13     mycar.stop()     #停止
     14     mycar.info()     #打印信息
     15 
    car.py

    car 

    - OOP小结:
                - 使用class AutoMobile定义了一个类,类中包含了
                  名称、颜色、排量等属性;启动(startup), 行驶(run),
                  停止(stop),打印信息(info)等方法

               - 方法在类的内部定义,也叫成员函数或方法,定义了
                  类“能干什么”,或“具有哪些功能”。和普通函数
                  有个重要差别,就是必须以self作为第一个参数。self
                  自动绑定调用该方法的对象

               - 实例化:创建一个类的对象
                  am = AutoMobile("家用轿车", "红色", 2.0)
                 
                  * 该语句执行成功后,会返回一个对象,通过赋值语句
                  将该对象绑定到am变量上
                  * 实例化对象时,要传入的参数根据__init__方法确定
               
                - __init__()方法,称之为“构造方法”
                  在对象被创建时自动调用
                  作用是创建属性,并且进行初始化

               - 对象被创建后,可以通过"对象.方法名()"来调用方法
                  通过"对象.属性"来访问对象的属性

    2. 面向对象三大特征: 封装、继承、多态
       1)封装
           - 将属性、方法放到类的内部
           - 对象对外提供了一组方法(接口),来对类的数据进行
             访问
           - 对于一个类或对象,外部主要关注功能,而不是功能的实现



       面向对象编写程序三步曲(记住,理解,应用)
        第一步:设计编写类。根据业务逻辑,从具体事物中归纳、
                      抽象出共同的属性、方法,并编写代码
                  class 类名:
                        #构造方法
                        #其它方法
         第二步:根据定义的类,实例化一个对象
                  ak = AK47()
                  awp = AWP()
         第三步:调用对象方法,使用类所提供的功能
                 ak.reload()
                 ak.fire()
                 awp.reload()
                 awp.fire()

      2)继承
         a)代码冗余:不同模块中相同或相似的代码
               导致的问题
                   - 重复劳动
                   - 编码、测试工作量增大
                   - 修改、维护困难
         b)继承
              - 将事物共同的特征抽象出来,定义到父类中
                 子类继承父类,自动获得父类的行为和属性
              - 继承描述事物的共同特征
              - 继承能够减少代码冗余,减少工作量,提升效率
                使得代码更容易维护

       c)几个相关概念
              - 父类(基类,超类)、子类(派生类)
              - 父类相对子类更抽象、范围更宽泛
                子类相对于父类更具体、范围更狭小
              - 单继承(只有一个父类,Java)
                多继承(超过一个父类, Python/C++)
          d)Python如何实现继承
               class 类名称(父类1[, 父类2...]):

         类的实现代码

         e) 通过继承改写AK47,AWP类,添加父类Gun
               见改写后的ak47.py, awp.py, gun.py, test.py

      1 # ak47.py
      2 # AK47类
      3 from gun import *
      4 
      5 class AK47(Gun): #继承自Gun类
      6     pass
    ak47.py
      1 # awp.py
      2 # 狙击枪类
      3 from gun import *
      4 
      5 class AWP(Gun):  #AWP类,继承自Gun类
      6     def openTelescope(self): #打开瞄准镜
      7         print("瞄准镜已打开")
      8 
      9     def closeTelescope(self): #关闭瞄准镜
     10         print("瞄准镜已关闭")
     11 
    awp.py
      1 # gun.py
      2 # 枪械类
      3 class Gun:
      4     def __init__(self, name, max_bullets,
      5                  bullet_left,dest_ratio,
      6                 firing_bullets):
      7         self.name = name  #名称
      8         self.max_bullets = max_bullets#弹夹容量
      9         self.bullet_left = bullet_left#剩余子弹
     10         self.dest_ratio = dest_ratio #杀伤系数
     11         # 每次开火击发子弹数量
     12         self.firing_bullets = firing_bullets
     13 
     14     def reload(self): # 填弹
     15         self.bullet_left = self.max_bullets
     16         print("填弹完成,剩余子弹%d发" % 
     17               self.bullet_left)
     18 
     19     def fire(self):  # 开火
     20         if self.bullet_left <= 0:#没子弹
     21             print("请填弹")
     22             return
     23 
     24         if self.bullet_left >= self.firing_bullets:
     25             self.bullet_left -= self.firing_bullets
     26         else: #剩余子弹小于一次击发打出的子弹
     27             self.bullet_left = 0 #全部打出
     28 
     29         # 计算杀伤力
     30         damage = int(self.dest_ratio*100)
     31 
     32         # 打印,模拟开火
     33         print("%s开火,杀伤力%d,剩余子弹%d" % 
     34           (self.name, damage, self.bullet_left))
     35 
    gun.py
      1 # test.py
      2 # 测试程序
      3 import ak47
      4 import awp
      5 
      6 ak = ak47.AK47("AK47", 30, 0, 0.4, 3) #实例化AK47对象
      7 ak.reload()      #填弹
      8 ak.fire()        #开火
      9 ak.fire()
     10 print("----------------")
     11 awp = awp.AWP("AWP", 10, 0, 1.0, 1)  #实例化AWP对象
     12 awp.reload()
     13 awp.fire()
     14 
     15 ak2 = ak47.AK47("AK47", 20, 0, 0.4, 3)
    test.py
    gun


      f)继承小结
             - 通过归纳、抽象,将共同特征(属性,行为)放到父类中
               子类通过继承,获得父类的行为和属性
             - 能够消除代码冗余
             - 能够在不改变父类代码的情况下,子类添加特有的行为
               和属性(例如AWP类中的openTelescope和
              closeTelescope方法),从而实现功能扩展、变更

    作业:
    1)定义一个鸟类(Bird),具有吃(eat),飞行(fly),
    繁殖(reproduction)方法
    2)定义老鹰类(Eagle),鸵鸟类(Ostrich)类,
    继承自Bird类
    3)编写测试代码,测试eat,fly,reproduction方法

      1 # bird.py
      2 # 鸟类
      3 class Bird:
      4     def __init__(self, name):
      5         self.name = name
      6 
      7     def eat(self):  # 吃方法
      8         print("%s正在吃饭" % self.name)
      9 
     10     def fly(self):  # 飞行
     11         print("%s正在飞行" % self.name)
     12 
     13     def reproduction(self): # 繁殖
     14         print("%s是卵生" % self.name)
     15 
     16 class Eagle(Bird):  # 老鹰类,继承自Bird
     17     def eat(self):   # 重写eat方法
     18         print("我是%s,我喜欢吃肉" % self.name)
     19 
     20     def fly(self):
     21         print("我是%s,飞的又高又快" % self.name)
     22 
     23 class Ostrich(Bird):  # 鸵鸟类,继承自Bird
     24     def fly(self):  # 重写fly方法
     25         print("我是%s,太重了不能飞" % self.name)
     26 
     27     def eat(self):
     28         print("我是%s,我是杂事动物" % self.name)
     29 
     30 if __name__ == "__main__":
     31     eagle = Eagle("老鹰")
     32     eagle.eat()
     33     eagle.fly()
     34     eagle.reproduction()
     35     print("")
     36     ostrich = Ostrich("鸵鸟")
     37     ostrich.eat()
     38     ostrich.fly()
     39     ostrich.reproduction()
     40 
    bird.py

    bird

  • 相关阅读:
    行政区划遮罩 -Leaflet
    WebGIS vs WebGL图形编程
    oracle 中 group by 加强
    Nagios监控服务搭建
    MySQL触发器使用详解
    mybatis--一对多关联
    mybatis--一对一关联查询
    mybatis--实现数据库增删改查
    mybatis--使用接口注解的方式实现Helloword
    mybatis--第一个mybatis程序
  • 原文地址:https://www.cnblogs.com/shengjia/p/10386824.html
Copyright © 2020-2023  润新知