Python知识分享第十四天

“”"
1.面向对象相关概述
概述
面向对象是一种编程思想 强调的是以对象为基础 完成的各种操作 它是基于面向过程的
扩展 Python中是同时支持面向对象和面向过程这两种编程思想的
思想特点
更符合人们的思考习惯
把复杂的问题简单化
把人们(程序员)从执行者变成了指挥者
2.面向对象三大特征介绍
封装
继承
多态
封装概述
封装就是隐藏对象的属性和实现细节 仅对外提供公共的访问方式
举例: 插板 电脑 手机
好处
提高代码的安全性
弊端
代码量增加了
继承概述
子类可以继承父类的某些成员 类似于现实中的子承父业
格式:
class 子类名(父类名):
pass
好处
提高代码的复用性
提高代码的可维护性
弊端
耦合性增强了
父类除了私有的功能 子类都有
多态概述:
指的是同一个事物在不同时刻表现出的不用形态
例如:
水 高温下气体 常温 液体 低温 固体 但是水 还是那个水
一个人: 学校可作为学生 去购物即为消费者
3.面向对象 入门代码
面向对象相关概述
属性 : 名词 用来描述事物的外在特征的 例如 姓名 性别 年龄 体重…
行为: 动词 表示事物能做什么 例如 学习 吃饭睡觉
类: 抽象的概念 看不见 摸不着 类等于 属性 + 行为
对象 类的具体实现
格式相关:
定义类的格式
class 类名
属性 就像定义变量一样
行为 就像定义函数一样 只不过 第一个形参要写 self
如何使用类中得成员
1.创建该类的对象
对象名 = 类名()
2.通过 对象名. 的方式来调用
对象名.属性
对象名.行为()

“”"

示例:
需求 定义一个汽车类 然后具有-跑的功能 并调用

# class Car():
#     def run(self):
#         print('汽车会跑')
#
#
# if __name__ == '__main__':
#     c1 = Car()
#     c2 = Car()
#
# c1.run()
# c2.run()
# print(f'c1:{c1}')
# print(f'c2:{c2}')

“”"
4. self关键字介绍
self关键字介绍
概述:
它是Python内置的一个属性 代表 本类当前对象的引用
大白话
哪个对象调用函数 函数内的self就代表哪个对象
谁调用 self就是谁
作用:
用于函数内 区分不同对象的 以为汽车类run()函数 C1对象能调用 c2对象也能调用 run()函数内部就可以通过self来区分 谁c1
谁是c2

“”"
需求 定义汽车类 有run()的功能 然后创建该类的对象 并调用run()功能 细节 run()要区分是哪个对象调用的

# 1.定义汽车类
# class Car:
#     def run(self):
#         print('汽车具有跑的功能')
#         print(f'当前对象是{self}')
#
#
# if __name__ == '__main__':
#     c1 = Car()
#     c2 = Car()
#
#     c1.run()
#     c2.run()
#
#     print(f'c1:{c1}')
#     print(f'c2:{c2}')

“”"
5.在类内访问类的函数
案例 在类内部调用类中的函数
调用函数的格式介绍:
类外: 对象名.的方式调用
类内: self. 的方式调用

回顾
函数内有self关键字 谁调用 谁就是self
函数只有被调用才会执行
“”"

# 需求: 定义汽车类 有跑的功能 在类内外调用run()函数
# class Car:
#     def run(self):
#         print('汽车可以跑')
#
#     def work(self):
#         self.run()
#         print('我是work函数')
#
#
# if __name__ == '__main__':
#     c1 = Car()
#     c1.run()
#
#     c1.work()
# 6.练习题- 手机类
"""
案例 :
    定义一个手机类 能开机 关机 拍照 
"""

# class Phone:
#     def open(self):
#         print('我能开机!')
#
#     def close(self):
#         print('我能关机')
#
#     def take_photo(self):
#         print('我能拍照')
#
#     def method(self):
#         self.open()
#         self.close()
#         self.take_photo()
#
#
# if __name__ == '__main__':
#     p = Phone()
#     p.open()
#     p.take_photo()
#     p.close()
#
#     p.method()
#
# import keyword
#
# print(keyword.kwlist)

7.属性的定义和调用
“”"
属性介绍:
概述:
属性 = 名词 即描述事物的外在特征
定义属性的格式
类外 对象名.属性名 = 属性值
类内: 要结合__init__()魔法方法一起使用
调用属性的格式:
类外 对象名.属性名
类内 self.属性名
遇到的问题:
在main函数中 通过对象名.属性名 = 属性值的方式 给c1对象设置了属性值了但是c2对象没有属性值
产生的原因L在类外设置属性 只能给当前对象设置 不能给本类其他对象设置
解决的方案 通过 init() 魔法方法在类内给该类的对象设置属性值 则该类所欲偶的对象默认有这些属性值
“”"

需求 给车设置颜色为红色 四个轮胎 且获取属性值 并输出

# 扩展 可以在类内部定义1个show方法来获取给车设置的属性
# 定义汽车类
# class Car:
#     def show(self):
#         print(f'颜色: {self.color}, 轮胎数: {self.num}')
#
#
# if __name__ == '__main__':
#     c1 = Car()
#     c1.color = '红色'
#     c1.num = 4
#     print(f'颜色: {c1.color} 轮胎数: {c1.num}')
#
#     c1.show()
#
#     c2 = Car()
    # c2.show()  # 会报错 因为c2没有color和num属性

8.魔法方法 - init- 无参数
“”"
魔法方法介绍:
概述:
它是Python内置的一些函数 主要是用来对类的功能做增强的
格式:
方法名()
特点:
在满足特定情况的场景喜爱 会被自动调用 无需用户手动调用
常用的魔法方法:
init() 在创建对象的时候 会被调用 一般用于给对象初始化一些属性值 即 对象名 = 类名() 时候 就会自动调用该方法
str() 当输出语句直接打印对象的时候 会自动调用该魔法方法 默认打印的是地址值 无意义 一般会改为 打印该对象的各个属性值
del() 当手动删除对象时 或者文件执行结束后 该函数会被自动调用

    大白话解释
        init魔法方法 创建一个对象 = 调用一次
        str魔法方法: 打印一次对象 = 调用一次
        del魔法方法: 只需要删除 一个该类的对象 = 调用一次

“”"

# 需求给车这个对象 设置默认属性值 所有的汽车类对象 默认都有这个属性值

# class Car():
#     def __init__(self):
#         print('我是init函数 我被掉用户了')
#         self.color = '黑色'
#         self.number = 3
#
#     def show(self):
#         print(f'颜色: {self.color} 轮胎数: {self.number}')
#
#
# if __name__ == '__main__':
#     c1 = Car()
#     c2 = Car()
#
#     c1.color = '霞光紫'
#     c1.number = 10
#
#     c1.show()
#     print('-'*22)
#
#     c2.show()
#
# #     类外掉属性
# print(c1.color, c1.number)
# print(c2.color, c2.number)

9.魔法方法 init - 有参数
“”"
回顾刚才的代码:
init魔法方法中的 属性值, 都是固定的, 写死的, 很不方便, 我们就思考, 这些参数值能不能通过 外部传参的方式来实现对其进行赋值操作呢?
答案:
肯定是可以的, 通过 带参数的init函数即可解决.
“”"

# 需求: 通过外部传参的方式, 给汽车对象设置属性值, 例如: 褐色, 6个轮胎.
# 1. 定义汽车类.
# class Car():

# 2. 通过 魔法方法 init, 初始化 汽车对象的属性值, 即: 所有汽车类对象, 默认都有这个属性值.

#     def __init__(self, color, number):
#         print('我是init 我被调用了')
#         self.color = color
#         self.number = number
#
#
#     def show(self):
#         print(f'颜色: {self.color} 轮胎数: {self.number}')
#
# if __name__ == '__main__':
#     c1 = Car('紫色', 100)
#     # c2 = Car()   # 报错 需要传参数
#     c1.color = '红色'
#     c1.number = 10
#
#     c1.show()

# 10.魔法方法-stu和del
# class Car():
#     def __init__(self, brand, price):
#         self.brand = brand
#         self.price = price
#
#     def run(self):
#         print('汽车会跑')
#
#     def __str__(self):
#         return f'品牌: {self.brand} 价格: {self.price}'
#
#
#     def __del__(self):
#         print(f'对象 {self} 被删除了!')
#
#
# if __name__ == '__main__':
#     c1 = Car('帕拉梅拉', 1800000)
#     print(c1)


# 11.案例-减肥
"""
案例:
    小明同学当前的体重为100Kg, 每跑步一次体重减少0.5Kg, 每大吃大喝一次, 体重增加2Kg, 尝试用面向对象思维解决该问题.
目的:
    考察 魔法方法, 类, 对象等的内容的使用.
"""

# class Student():
#     def __init__(self, weight):
#         self.current_weight = weight
#
#     def run(self):
#         self.current_weight -= 0.5
#         print('跑步一次, 体重减少 0.5Kg!')
#     def eat(self):
#         self.current_weight += 2
#         print('大吃大喝一次, 体重增加 2Kg!')
#
#     def __str__(self):
#         return f'当前体重是{self.current_weight} kg!'
#
# if __name__ == '__main__':
#     # 1. 创建学生对象.
#     xm = Student(100)
#
#     # 2. 调用行为.
#     xm.run()
#     xm.run()
#     xm.run()
#     print('-' * 22)
#
#     xm.eat()
#     xm.eat()
#     xm.run()
#     print('-' * 22)
#
#     # 3. 打印最终结果.
#     print(xm)

12.案例-烤地瓜

"""
案例: 烤地瓜
    烘烤时间        对应的地瓜状态
    0 ~ 3分钟         生的           0 < time <= 3
    3 ~ 7分钟         半生不熟        3 < time <= 7
    7 ~ 12分钟        熟了           7 < time <= 12
    超过12分钟        已烤焦, 糊了      time > 12

分析:
    名词: 写到 init()魔法方法中
        地瓜被烤的时间 cook_time
        地瓜的生熟状态 cook_state
        添加的调料    condiments

    动词: 定义成 函数
        烤(地瓜)     cook()
        添加(调料)   add_condiment()
"""

class SweetPotato:
    def __init__(self):
        self.cook_time = 0
        self.cook_state = '生的'
        self.condiments = []


    def cook(self, time):
        if time < 0:
            print('请输入合法时间')
        else:
            self.cook_time += time
            if 0 <= self.cook_time < 3:
                self.cook_state = '生的'
            elif 3 <= self.cook_time < 7:
                self.cook_state = '半生不熟'
            elif 7 <= self.cook_time <= 12:
                self.cook_state = '熟了'
            else:
                self.cook_state = '烤焦, 糊了'
    def add_condiments(self, condiment):
        self.condiments.append(condiment)

    def __str__(self):
        return f'考地瓜的时间是: {self.cook_time} 地瓜的状态是 {self.cook_state} 添加的香料是 {self.condiments}'

if __name__ == '__main__':
    # 2.1 创建地瓜对象.
    digua = SweetPotato()

    # 2.2 烘烤动作.
    # digua.cook(-10)   # 非法值.
    digua.cook(0)
    digua.cook(5)
    digua.cook(3)
    digua.cook(4)
    digua.cook(1)

    # 2.3 添加调料.
    digua.add_condiments('番茄酱')
    digua.add_condiments('辣椒酱')
    digua.add_condiments('孜然粉')

    # 2.4 打印地瓜信息.
    print(digua)

坚持分享 共同进步 手敲 如有错误 欢迎指出

你可能感兴趣的:(python,开发语言)