python第十次课 面向对象及案例

一、面向对象简介

概念:

  • 面向对象编程【简称: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()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值