面向对象进阶
Created|Updated
|Post Views:
子类重写父类的功能
1 | # 小明掌握了老师傅和黑马的技术后, |
子类访问父类功能
方式1: 父类名.父类功能名(self)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41"""
很多顾客都希望能吃到徒弟做出的有自己独立品牌的煎饼果子,
也有黑马配方技术的煎饼果子味道。
语法格式:
1:父类名.父类函数名(self) 精准访问,想找哪个父类,就调用哪个父类
2: super().父类函数名() 只能访问最近的那个父类,有就用,没有就继续往后找,找不到就报错
"""
class Master:
def __init__(self):
self.kongfu = "[古法煎饼果子配方]"
def make_cake(self):
print(f"Master:运用{self.kongfu}制作煎饼果子")
class School:
def __init__(self):
self.kongfu = "[黑马AI煎饼果子配方]"
def make_cake(self):
print(f"School:运用{self.kongfu}制作煎饼果子")
class Prentice(School, Master):
# 创新
def __init__(self):
self.kongfu = "[独创的煎饼果子配方]"
def make_cake(self):
print(f"运用{self.kongfu}制作煎饼果子")
# 需求:同时满足 独创 & 古法
def make_master_cake(self):
School.__init__(self) # 这里需要初始化父类的self。不然还会调用子类的self 打印独创
Master.make_cake(self)
def make_school_cake(self):
Master.__init__(self) # 这里需要初始化父类的self。不然还会调用子类的self 打印独创
School.make_cake(self)
p = Prentice()
print(p.kongfu) # 独创
p.make_cake() # 独创
p.make_master_cake() # 独创 古法?方式2: super().父类功能名()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30# 很多顾客都希望能吃到徒弟做出的有自己独立品牌的煎饼果子,
# 也有黑马配方技术的煎饼果子味道。
class Master:
pass
# def __init__(self):
# self.kongfu = "[古法煎饼果子配方]"
# def make_cake(self):
# print(f"Master:运用{self.kongfu}制作煎饼果子")
class School:
pass
# def __init__(self):
# self.kongfu = "[黑马AI煎饼果子配方]"
# def make_cake(self):
# print(f"School:运用{self.kongfu}制作煎饼果子")
class Prentice(Master,School):
# 创新
def __init__(self):
self.kongfu = "[独创的煎饼果子配方]"
def make_cake(self):
print(f"运用{self.kongfu}制作煎饼果子")
def make_old_cake(self):
super().__init__()
super().make_cake()
p = Prentice()
print(p.kongfu)
p.make_cake()
print("*"*24)
p.make_old_cake()
封装入门
1 | # 小明把技术传承给徒弟的同时,不想把自己的私房钱($5000000) |
多态入门
1 | # 定义动物类 |
多态案例_构建对战平台

1 | # 构建对象对战平台object_play |
抽象类案例_空调案例
1 | """ |
对象属性和类型属性解释
图解

代码演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44"""
属性介绍:
概述:
他是一个用来描述事物特征,他是名字
分类:
对象属性:属于每个对象,即:每个对象的属性值可能不同.
类属性:属于类的,即:能被该类下所有的对象所共享
对象属性:
定义到 init魔法方法的属性。每个对象都有自己的内容
只能通过对象名.的方式调用
类属性:
定义到类中,函数外的属性(变量),能被该类下所有的对象所共享
既能通过 类名. 还能通过 对象名. 的方式来调用,推荐 类名.方式
"""
class Student:
# 类属性 :类中函数外
teacher_name = "张老师"
# 定义对象属性 即:定义到 init魔法方法的属性
def __init__(self, name):
self.name = name
def __str__(self):
return f"姓名{self.name}"
s1 = Student("孔老师")
print(s1)
s2 = Student("王老师")
print(s2)
# 类属性 类名.属性
print(Student.teacher_name)
# 共享
print(s1.teacher_name)
print(s2.teacher_name)
# 改类属性
Student.teacher_name = "胡老师"
print(s1.teacher_name)
print(s2.teacher_name)
print(Student.teacher_name)
类方法和静态方法
1 | """ |
学生管理系统_学生类代码编写
如下是写到 student.py 文件中的代码
1 | """ |
学生管理系统_框架搭建
如下是写到 studentcms.py 文件中的内容.
1 | """ |
学生管理系统_入口文件
如下的代码是写到 main.py 文件中的.
1 | """ |
学生管理系统_功能实现
添加学生
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 4. 定义函数, 实现添加学生信息功能.
def add_student(self):
# 4.1 提示用户输入学生信息, 并接收.
name = input('请输入学生姓名:')
gender = input('请输入学生性别:')
age = int(input('请输入学生年龄:'))
phone = input('请输入学生电话:')
desc = input('请输入学生描述信息:')
# 4.2 把上述的信息封装成学生对象.
stu = Student(name, gender, age, phone, desc)
# 4.3 把学生对象添加到列表中.
self.stu_list.append(stu)
# 4.4 提示.
print(f'添加 {name} 学生信息成功!\n')查看所有学生信息
1
2
3
4
5
6
7
8
9
10# 8. 定义函数, 实现查询所有学生信息功能.
def search_all_student(self):
# 8.1 判断列表长度是否为0, 如果为0, 提示: 暂无学生信息, 请添加后查询.
if len(self.stu_list) == 0:
print('暂无学生信息, 请添加后查询! \n')
else:
# 8.2 如果长度不为0, 遍历列表, 打印出所有的学生信息.
for stu in self.stu_list:
print(stu)
print() # 为了格式好看, 加个换行.删除学生信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 5. 定义函数, 实现删除学生信息功能.
def del_student(self):
# 5.1 提示用户输入要删除的学生的姓名, 并接收.
del_name = input('请输入要删除的学生姓名:')
# 5.2 遍历列表, 找到要删除的学生, 并删除.
for stu in self.stu_list:
# 5.3 如果当前学生的姓名 和 要删除的学生相同, 就删除该学生信息
if stu.name == del_name:
self.stu_list.remove(stu)
print(f'学员 {del_name} 信息删除成功!\n')
break
else:
# 走到这里, 说明没有走break, 即: 没有找到这个学生.
print('查无此人, 请检查后重新删除!\n')修改学生信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 6. 定义函数, 实现修改学生信息功能.
def update_student(self):
# 6.1 提示用户输入要修改的学生的姓名, 并接收.
upd_name = input('请输入要修改的学生姓名:')
# 6.2 遍历列表, 找到要修改的学生, 并修改.
for stu in self.stu_list:
# 6.3 如果当前学生的姓名 和 要修改的学生相同, 就修改该学生信息
if stu.name == upd_name:
# 6.4 提示用户录入该学员新的信息.
stu.gender = input('请录入修改后的性别: ')
stu.age = int(input('请录入修改后的年龄: '))
stu.phone = input('请录入修改后的电话: ')
stu.desc = input('请录入修改后的描述信息: ')
print(f'学员 {upd_name} 信息修改成功!\n')
break
else:
# 走到这里, 说明没有走break, 即: 没有找到这个学生.
print('查无此人, 请检查后重新操作!\n')查询单个学生信息
1
2
3
4
5
6
7
8
9
10
11
12
13# 7. 定义函数, 实现查询单个学生信息功能.
def search_one_student(self):
# 7.1 提示用户输入要查找的学生的姓名, 并接收.
search_name = input('请输入要查找的学生姓名:')
# 7.2 遍历列表, 找到要查找的学生, 并打印信息.
for stu in self.stu_list:
# 7.3 如果当前学生的姓名 和 要查找的学生相同, 就打印该学生信息
if stu.name == search_name:
print(stu, end='\n\n')
break
else:
# 走到这里, 说明没有走break, 即: 没有找到这个学生.
print('查无此人, 请检查后重新操作!\n')
扩展_dict属性
1 | """ |
学生管理学系统_保存学生信息
1 | # 9. 定义函数, 实现保存学生信息功能. |
学生管理系统_加载学生信息
1 | # 10. 定义函数, 实现加载学生信息. |
学生管理系统_最终代码
student.py 文件中的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32"""
该文件用于记录学生类 ,学生属性信息有姓名、性别、年龄、联系方式、描述信息等;
"""
class Student:
"""
对象属性 :__init__方法中
"""
def __init__(self, name, gender, age, phone, desc):
self.name = name
self.gender = gender
self.age = age
self.phone = phone
self.desc = desc
# 可以使用魔法方法进行统一格式输出
def __str__(self):
return f"姓名:{self.name},性别{self.gender},年龄{self.age},手机号{self.phone},描述信息{self.desc}"
# if __name__ == '__main__':
s1=Student("张三","男",20,"12343242342","这是一个好人")
# print(f"我是测试案例{s1}")
# main 回车键
#
if __name__ == '__main__':
s1 = Student("张三", "男", 20, "12343242342", "这是一个好人")
#
#studentcms.py 文件中的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129"""
该类的作用就是完成学生管理操作 :即增删改查
"""
# import student as st
from student import Student
import os
class StudentCMS:
def __init__(self):
self.stu_list = [] # 主要使用用于存储学生信息 [stu,stu,stu,stu] 面向对象
# 实现功能(定义方法)
@staticmethod
def show_view():
print("*" * 24)
print("学生管理系统V2.0面向对象版本")
print("1.添加学生信息")
print("2.修改学生信息")
print("3.删除学生信息")
print("4.查询某个学生信息")
print("5.显示所有学生信息")
print("6.保存学生信息")
print("7.加载学生信息")
print("0.退出系统")
print("*" * 24)
def add_student(self):
name = input("请输入学生姓名")
gender = input("请输入学生性别")
age = int(input("请输入学生年龄"))
phone = input("请输入学生电话")
desc = input("请输入学生描述")
stu = Student(name, gender, age, phone, desc)
self.stu_list.append(stu)
print(f"添加{name}学生信息成功")
def update_student(self):
upd_name = input("请输入要修改学生姓名")
for stu in self.stu_list:
if stu.name == upd_name:
stu.gender = input("请输入您要修改的性别")
stu.age = input("请输入您要修改的年龄")
stu.phone = input("请输入您要修改的手机号")
stu.desc = input("请输入您要修改的描述信息")
print(f"学生{upd_name}信息修改成功")
break
else:
print("查无此人")
def del_student(self):
del_name = input("请输入您要删除学生姓名")
for stu in self.stu_list:
if stu.name == del_name:
self.stu_list.remove(stu)
print(f"学员{del_name}信息删除成功")
break
else:
print("查无此人")
def search_one_student(self):
search_name = input("请输入您要查找学生姓名:")
for stu in self.stu_list:
if stu.name == search_name:
print(stu)
break
else:
print("查无此人")
# print("search_one_student")
def search_all_student(self):
if len(self.stu_list) == 0:
print("暂无学生信息")
else:
for stu in self.stu_list:
print(stu)
def save_student(self):
with open("./stu_data.txt","w",encoding="utf-8") as dets_f:
stu_dict= [stu.__dict__ for stu in self.stu_list]
# for stu in self.stu_list:
# dets_f.write(str(stu))
dets_f.write(str(stu_dict))
def exit_student(self):
os._exit(0)
# 加载.txt文本文件中的学生信息
# 读文件
# 遍历将文件内容加载列表中
def load_student(self):
try: #万一没有文件呢!!!
with open("./stu_data.txt","r",encoding="utf-8") as src_f:
stu_data=src_f.read() #[字典,字典,字典]
#把里面的字符串,根据字符串特点,推断合适格式
stu_list=eval(stu_data)
if len(stu_list)==0:
stu_list=[]
#把列表套字典转换为[学生对象,学生对象,学生对象...] 赋值 self.stu_list
self.stu_list=[Student(**stu_dict) for stu_dict in stu_list]
except:
with open("./stu_data.txt","w",encoding="utf-8") as src_f:
pass
def star(self):
while True:
StudentCMS.show_view()
input_num = input("请您输入要操作编号")
if input_num == "1":
self.add_student()
elif input_num == "2":
self.update_student()
elif input_num == "3":
self.del_student()
elif input_num == "4":
self.search_one_student()
elif input_num == "5":
self.search_all_student()
elif input_num == "6":
self.save_student()
elif input_num == "7":
self.load_student()
elif input_num == "0":
self.exit_student()
else:
print("您输入的有误!!!")
if __name__ == '__main__':
cms = StudentCMS()
cms.star()main.py 文件中的代码
1
2
3
4
5
6
7
8
9
10
11"""
该文件 作为整个程序的入口文件
"""
from studentcms import StudentCMS
if __name__ == '__main__':
#我只在这个main.py文件中创建对象
stu_cms=StudentCMS()
stu_cms.star()
Author: 甘虎文
Link: http://example.com/2023/07/07/PyAdvanced/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%BF%9B%E9%98%B6/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles
2023-09-12
数据结构与算法
冒泡排序_思路及代码 123456789101112131415161718192021222324252627282930313233343536373839404142"""排序算法稳定性介绍: 概述:排序算法= 把一串数据按照升序或者降序的方式进行排列 方法、思维、方式 分类: 稳定排序算法 排序后,想同元素的相对位置不发生改变 不稳定排序算法 排序后,想同元素的相对位置发生改变 冒泡排序: 原理:相邻元素两两比较,大的往后走,这样第一轮比较厚,最大值在最大索引处 重复该动作,只要排序完毕。 核心: 1:比较的总轮数 列表的长度-1 2:每轮比较的总次数 列表的长度-1-当前轮数的索引 3:谁和谁比较 ? 列表[j]和列表[j+1] 分析流程: 假设元素个数5个 ,具体如下: [5,3,4,7,2] 长度为5 比较的轮数,i...
2023-09-29
数据结构与算法1
数据结构和算法简介 数据结构 就是存储和组织数据的方式, 分为: 线性结构 和 非线性结构 算法 就是解决问题的思路和发放, 它具有独立性, 即: 它不依赖语言, 而是解决问题的思路. Java能做, Python也能做. 特性 有输入, 有输出, 有穷性, 确定性, 可行性. 如何衡量算法的优劣 ==大O标记法,== 即: 将次要条件都省略掉, 最终形成1个表达式. **主要条件:**随着问题规模变化而==变化==的. **次要条件:**随则问题规模变化而==不变==的. 最优和最坏时间复杂度 如非特殊说明, 我们考虑的都是 最坏时间复杂度, 因为它是算法的一种保证. 而最优时间复杂度是算法的 最理想, 最乐观的状况, 没有太大的参考价值. 常见的时间复杂度如下 从最优到最坏分别是: O(1) -> O(logn) -> O(n) -> O(n logn) -> O(n²) -> O(n³) ...
2023-08-09
生成器_正则
多线程特点_随机性12345678910111213141516171819202122import threading# 使用多线程来模拟小明一边编写num行代码,一边听count首音乐功能实现。def coding(name, num): for i in range(num): print(f"{name}正在敲{i}行代码")def music(name, count): for i in range(count): print(f"{name}正在听{i}遍音乐")# args 元组# kwargs 字典if __name__ == '__main__': t1 = threading.Thread(target=coding, args=("小明", 100)) t2 = threading.Thread(target=music, args=("小...
2023-10-31
网络编程_进程_线程
网络编程介绍 概述 就是用来实现网络互联的 不同计算机上 运行的程序间 可以进行数据交互. 三要素 IP地址: 设备(电脑, 手机, Ipad…)在网络中的唯一标识 分类: IPV4, 4字节, 十进制. 例如: 192.168.88.100 IPV6, 8字节, 十六进制, 宣传语: 可以让地球上的每一粒沙子都有自己的IP 两个DOS命令: 查看IP: windows: ipconfig Linux, Mac: ifconfig 测试网络连接: ping ip地址 或者 域名 端口号: 程序在设备(电脑, 手机, Ipad…)上的唯一标识. 范围: 0 ~ 65535, 其中0 ~ 1023已经被系统占用或者用作保留端口, 自定义端口时尽量规避这个范围. 协议: 传输规则, 规范. 常用的协议: TCP(这个用的最多) 和 UDP TCP特点: 1.面向有连接 2.采用字节流传输数据, 理论无大小限制. 3.安全(可靠)...
2023-05-02
闭包_装饰器_深浅拷贝
闭包背景介绍12345678910111213141516171819"""案例目的: 引出闭包相关知识点"""# 定义一个函数用于保存变量10,然后调用函数返回值变量并重复累加数值,观察效果。def func(): num = 10 return numnum = func()print(num + 1) # 11 想要结果是 11print(num + 1) # 11 vs 12print(num + 1) # 11 vs 13# 你会发现无法实现累加!那么如何实现累加呢!! 闭包 闭包入门 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758# 定义一个用于求和的闭包。# 其中,外部函数有参数num1,内部函数有参数num2,# 然后调用,并用于求解两数之和,观察效果"&qu...
2023-06-03
面向对象基础
面向对象和面向过程 编程思想 就是人们利用计算机来解决问题的思维. 分类 面向过程 它是一种编程思想, 强调的是以 步骤(过程) 为基础完成各种操作. 面向对象 参考思路: 概述, 思想特点, 举例, 总结 它是一种编程思想, 强调的是以 对象 为基础完成各种操作, 它是基于 面向过程的.说到面向对象, 不得不提的就是它的三大思想特点: 1. 更符合人们的思考习惯. 2. 把复杂的事情简单化. 3. 把人们(程序员)从执行者变成指挥者. 举例: 越符合当时的场景越好, 例如: 买电脑, 洗衣服… 总结: 万物接对象. 面向对象特征介绍 三大特征 封装 继承 多态 封装简介 概述 就是隐藏对象的属性和实现细节, 仅对外提供公共的访问方式. 举例 电脑, 手机, 函数, 类 = 属性 + 行为 好处 提高代码的安全性. (私有化) 提高代码的复用性. (函数) 继承 概述 子类继承父类的成员, 例如: 属性, 行为等.大白话: 子承父业. 好处 提高代码的复用性. 多态...