一、面向对象简介

概念:

  • 面向对象编程【简称:OOP】

开发程序模式

  • 面向过程:
  • 程序得开发过程是根据业务逻辑走【根据要求写语句】
  • 如何达成目标
  • 面向对象:
  • 程序得开发过程是围绕数据走
  • 操作将会影响谁

案例:打印tom、jerry、jack三个学员的信息,信息包括姓名、年龄、地址

# ================ 面向过程 ===================
# 定义第一个学员
 stu1 = {
     "name":"tom",
     "age":"18",
     "addr":"hebei"
 }
# 定义第一个学员
 stu2 = {
     "name":"jerry",
     "age":"18",
     "addr":"tianjin"
 }
# 定义第一个学员
 stu3 = {
     "name":"jack",
     "age":"18",
     "addr":"beijing"
 }def showStu(**stuInfo):
     print("%s 的 年龄是 %s, 地址是%s"%(stuInfo["name"],stuInfo["age"],stuInfo["addr"]))showStu(**stu1)
 showStu(**stu2)
 showStu(**stu3)

面试问题:你如何理解面向对象和面向过程

  • 面向过程主要是需要关注具体的过程
  • 面向对象主要是着眼点是如何达到最终效果

  • 这是一个抽象概念,统指一类事物,比如人、动物、狗
  • 类是无法直接使用,必须将类实例化一个对象以后,基于这个对象才能使用

实例化

  • 将一个抽象的类具体化到某一个具体的对象,这个过程实例化

对象

  • 实例化的结果就是对象

案例:

汽车         类
奥迪           类
奥迪a6       类
我的奥迪a6    对象

狗                  类
大黄狗               类
小伙家门口的哪个日本   对象

水果
苹果
我吃了一块的苹果   

灯             类
我家客厅灯      对象


面向对象编程的特点

  • 一切皆为对象,列表、字典、字符串、元组
  • 例如:列表就是一个对象,列表中的每个元素也都是对象
  • python就是一堆对象集合
  • 每个对象都是实例化的结果
  • 每一类对象都具有自己特定的属性和方法
# 列表是一个类
# 创建一个列表对象【类的实例化】
 li1 = [1,2,3]# 列表类的方法
 li.pop()
li.append()# 字符串是一个类
# 创建字符串对象
 str1 = "123"

注意:所有的对象,都是由类生成的,类具有的方法,其所有生成的对象都会具有


类的组成

  • 类名
  • 类方法:
  • 类的方法其实就是类里面的函数
  • 方法其实就是能做的事情
  • 类属性:
  • 类的属性其实就是类里面的一个变量
  • 属性其实就是这一类事物具有的特点、特性

案例:以狗类为例

类名:狗
类属性:品种、性别、毛色、体重、身高、年龄
类方法:叫、咬、吃、喝、拉、撒、跑


面向对象的三个原则

  • 封装:
  • 隐藏具体的实现细节
  • 继承:
  • 子类会继承父类所有的属性和方法
  • 上级类:父类、基类、超类
  • 下级类:子类、派生类
  • 多态:
  • 传递不同的数据,会返回不同的结果

2、面向对象简单实现

定义类的格式

# 定义经典类
 class 类名():
     属性
     方法# 定义新式类
 class 类名(父类名):
     属性
     方法

说明

  • 函数名:第二个单词首字母大写
  • 类名:每个单词首字母大写

案例:

# 定义一个类
 class StuInfo():
     # 定义属性
     age = "10"
     addr = "hebei"
     name = "tom" # 定义方法
     def showInfo(self):  # 类中的方法的第一个形参必须是self
         #print("%s的年龄是%s, 地址在%s"%(name, age, addr))     # 此时这三个变量是去全局段找
         print("%s的年龄是%s, 地址在%s"%(self.name, self.age, self.addr))   # 加上self是去类内部找变量# 进行实例化,将实例化结果赋值给stu1变量
# stu1是一个对象
 stu1 = StuInfo()# 显示类属性
 print(stu1.age)
 print(stu1.addr)
 print(stu1.name)# 调用类方法
 stu1.showInfo()

案例:

class Car():
     def Start(self):
         print("汽车启动...")    def Run(self):
         print("汽车在行驶...")    def Stop(self):
         print("汽车停止...")myCar = Car()
myCar.Start()
 myCar.Run()
 myCar.Stop()

给类添加属性

# 定义一个类
 class Car():
     # 定义一个属性
     speed = "30"  # 定义一个方法
     def Start(self):
         print("汽车启动...")
     # 定义一个方法
     def Run(self):
         print("品牌是%s, 车型是%s,汽车在行驶,速度是%s "%(myCar.carPai, myCar.carType, self.speed))
     # 定义一个方法
     def Stop(self):
         print("汽车停止...")# 将类实例化成对象,将对象赋值给myCar
 myCar = Car()# 修改类中的属性
 myCar.speed = "80"
# 给类添加属性
 myCar.carType = "SUV"
 myCar.carPai = "领克"# 调用类方法
 myCar.Start()
 myCar.Run()
 myCar.Stop()

类多次实例化的问题

# 定义一个类
 class Car():
     carType = "SUV"
     carPai = "领克"
     # 定义一个方法
     def Run(self):
         print("品牌是%s, 车型是%s,汽车在行驶"%(self.carPai, self.carType))# 将类实例化成对象,将对象赋值给myCar
 myCar = Car()
# 给类添加属性
 myCar.carType = "SUV"
 myCar.carPai = "领克"
# 调用类方法
 myCar.Run()# 将类实例化成对象,将对象赋值给yourCar
 yourCar = Car()
# 给类添加属性【因为上面已经添加过carType和carPai两个属性了,因此这里其实是在修改属性】
 yourCar.carType = "轿车"
 yourCar.carPai = "宝马"
# 调用类方法
 yourCar.Run()

3、两个内置方法

__init__
不需要调用,可以自动执行,也就是当实例化的时候,就自动执行
主要的作用是用于初始化一些变量

__str__
不需要调用,可以自动执行,也就是当实例化的时候,就自动执行
主要的作用是用于输出一些提示信息

定义属性的时候,有两种方法

  • 方法1:在类中直接进行定义,和之前定义变量完全一样
  • 方法2:在类的方法中进行定义,定义格式 self.变量名 = 值
  • 如果在类的方法中定义变量的时候,如果没有加self,那么这个变量就是局部变量

案例

# 定义一个类
 class Car():
     # init 方法
     def __init__(self,carType, carSpeed):
         # 定义类属性
         self.speed = carSpeed
         self.type = carType
         print("haha,初始化成功")# str 方法
     def __str__(self):
         return "这是我们的第一个类的练习"  # 定义一个方法
     def Run(self):
         print("车型是%s,速度是%s"%(self.type, self.speed))# 将类实例化成对象,将对象赋值给myCar
 myCar = Car("suv","50")
 print(myCar)
 myCar.Run()

4、类的内置属性和方法

python的变量

  • 直接用 变量名 = 变量值 定义
  • 用 双下划线加上变量名进行定义,类中的私有属性,只有类内部可以使用,子类无法使用
  • 单下划线加上变量名进行定义,这是特殊的属性,无法直接访问,需要提供特殊接口才能访问
  • 用 双下划线加上变量名再加双下划线进行定义
# 常规变量
 name = "tom"# 类的私有属性
 __name = "tom"# 特殊属性,无法直接访问
 _name = "tom"# pyhton中特殊方法的专用标识
 __name__ = "tom"__dict__  获取类中的全部的属性
 dir()     获取类中的全部的属性
 __name__  获取类的名字
 __doc__   获取类的说明文档
 __base__  获取当前这个类的父类信息

案例:

# 定义一个类
 class MyClass():
     """
         这是我的测试类
         你听懂了吗
     """
     name = "python开发"
     def __init__(self):
         self.height = "175"
     def show(self):
         age = "20"
         print("%s 的年龄是 %s, 身高是%s"%(selfname, age, self.height))# 通过 __dict__ 可以显示类的全部的属性
 print(MyClass.__dict__)     # 即可以显示属性,也可以显示属性的值
 print(dir(MyClass))         # 仅仅显示属性,不可以显示属性的值
 print(MyClass.__name__)
 print(MyClass.__doc__)
 print(MyClass.__base__)

可用的变量

  • 全局变量:定义在主程序【类外面】
  • 类变量:定义在类内部,但是不是类的方法里
  • 局部变量:定义在类的方法中的变量,而且定义变量的时候没有加self

5、案例:烤地瓜

让用户输入烘烤时间

  • 烘烤时间在0-3分钟,表示生
  • 烘烤时间在4分钟,表示夹生
  • 烘烤时间在5-8分钟,表示熟
  • 烘烤时间超过8分钟,表示糊了

版本1:面向过程

import sys
 def cooke(cTime):
     try:
         cTime = int(cTime)
     except Exception:
         print("时间格式不对")
         sys.exit()    if cTime>=0 and cTime<=3:
         str = "地瓜还是生的"
     elif cTime == 4:
         str = "地瓜还是夹生的"
     elif cTime>=5 and cTime<=8:
         str = "地瓜是熟的"
     elif cTime>8:
         str = "糊了"
     else:
         print("时长错误")
         sys.exit(3)    print(str)
userInput = input("请输入烹饪时长:")
 cooke(userInput)

版本2:面向对象

分析和规划

属性:

  • cTime 表示的是烹饪时间长度
  • str 表示定义字符串,描述地瓜的生疏程度

方法:

  • init:初始化变量
  • str:让输出结果更美观
  • cooke:烘烤地瓜的方法
import sys
class DiGua():
     # 初始化变量
     def __init__(self, t1):
         self.cTime = t1
        self.str = ""
    # 烹饪
     def cooke(self):
         if self.cTime>=0 and self.cTime<=3:
             self.str = "地瓜还是生的"
         elif self.cTime == 4:
             self.str = "地瓜还是夹生的"
         elif self.cTime>=5 and self.cTime<=8:
             self.str = "地瓜是熟的"
         elif self.cTime>8:
             self.str = "糊了"
         else:
             print("时长错误")
             sys.exit(3)        print(self.str)
try:
     userInput = int(input("请输入烹饪时长:"))
 except Exception:
     print("时间错误")
     sys.exit(3)
    
# 实例化
 digua = DiGua(userInput)# 调用方法去烹饪
 digua.cooke()