“”"
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)
坚持分享 共同进步 手敲 如有错误 欢迎指出